Hello Mat

 找回密码
 立即注册
查看: 1765|回复: 1

sndfile.h读取音频

[复制链接]

1323

主题

1551

帖子

0

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22647
发表于 2024-1-5 21:11:56 | 显示全部楼层 |阅读模式
  1. 当你使用sf_open函数打开音频文件后,你可以使用sf_read_float函数来读取音频数据。这个函数将返回一个指向浮点数数组的指针,其中包含了音频样本值。

  2. 下面是一个示例代码片段,演示如何使用sf_read_float函数读取音频数据:

  3. cpp
  4. 复制
  5. #include <sndfile.h>#include <iostream>int main() {
  6.     SF_INFO info;
  7.     SNDFILE* file = sf_open("audio_file.wav", SFM_READ, &info);
  8.     if (!file) {
  9.         std::cerr << "Failed to open file" << std::endl;
  10.         return 1;
  11.     }
  12.     // 读取音频数据
  13.     float* buffer = new float[info.frames];
  14.     sf_read_float(file, buffer, info.frames);
  15.     // 处理音频数据(例如,输出样本值)
  16.     for (int i = 0; i < info.frames; ++i) {
  17.         std::cout << buffer[i] << std::endl; // 输出每个样本的浮点值
  18.     }
  19.     delete[] buffer; // 释放内存
  20.     // 关闭音频文件句柄
  21.     sf_close(file);
  22.     return 0;
  23. }


  24. 在上述代码中,我们首先打开音频文件并检查是否成功打开。然后,我们创建一个浮点数数组buffer来存储音频数据,并使用sf_read_float函数读取音频数据到缓冲区中。最后,我们遍历缓冲区中的每个样本值,并将其输出到控制台。最后,我们释放内存并关闭音频文件句柄。

  25. 请注意,上述代码中的浮点数数组buffer的大小是根据音频文件的帧数确定的。你需要确保分配足够的内存来存储音频数据。
复制代码


算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

1323

主题

1551

帖子

0

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22647
 楼主| 发表于 2024-1-5 21:12:26 | 显示全部楼层
  1. 要将使用sf_read_float函数获取的音频数据转换为Tensor,你可以使用PyTorch库。下面是一个示例代码片段,演示了如何完成这个过程:

  2. cpp
  3. 复制
  4. #include <soundfile.h>#include <torch/script.h>#include <vector>torch::Tensor LoadAudioFile(const std::string& filename) {
  5.     SF_INFO info;
  6.     SNDFILE* file = sf_open(filename.c_str(), SFM_READ, &info);
  7.     if (!file) {
  8.         std::cerr << "Failed to open file" << std::endl;
  9.         return torch::Tensor();
  10.     }
  11.     // 读取音频数据
  12.     std::vector<float> data(info.frames);
  13.     sf_read_float(file, data.data(), info.frames);
  14.     sf_close(file);
  15.     // 将数据转换为Tensor
  16.     torch::Tensor tensor_data = torch::from_blob(data.data(), {1, info.channels, info.frames});
  17.     tensor_data = tensor_data.permute({2, 0, 1});  // 调整维度顺序为 [时间, 通道, 批次]
  18.     tensor_data = tensor_data.to(torch::kFloat32);  // 将数据类型转换为float32
  19.     return tensor_data;
  20. }


  21. 在这个示例中,我们首先使用soundfile库的sf_open函数打开音频文件,并获取音频文件的元数据。然后,我们使用sf_read_float函数读取音频数据到一个std::vector中。接下来,我们将原始数据转换为PyTorch的Tensor对象,并调整维度顺序。最后,我们将数据类型转换为float32。

  22. 请注意,这个示例中的Tensor形状是[时间, 通道, 批次],其中时间表示音频信号的时间长度,通道表示音频的通道数(例如,立体声为2),批次表示批次大小(在这里设置为1)。根据你的具体需求,你可能需要调整Tensor的形状和维度顺序。
复制代码
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-11-22 23:04 , Processed in 0.193395 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表