gpt4 book ai didi

c++ - 获取 wav 文件的帧和样本

转载 作者:行者123 更新时间:2023-11-30 04:01:38 26 4
gpt4 key购买 nike

首先,我尝试在没有任何专有库的情况下执行此操作,以便它更具可移植性,并且我对这里发生的事情有更好的/实际的了解。我可以编写自己的类和库来处理重复功能(解析 header 等)。

所以我想知道如何通过流读取 WAV/RIFF 文件,以便计算有关所述音频文件的信息(即文件中音频的长度,多少样本,多少帧等)。然后遍历这些帧或示例以实现其他功能。

我知道它会通过 fstream 将其作为二进制文件读取并允许标题(并从标题中获取一些信息),如 RIFF specs 中指定的那样但是如何辨别字节到帧或样本,以及长度?

我可以在其他语言中找到处理这个问题的问题,但在 C++ 中没有看到任何与它直接相关的问题。

最佳答案

我相信读取 WAV 文件与读取任何二进制文件(例如位图)是一样的。基本思路是先读取文件头,然后根据文件头显示的信息读取数据。 header 通常可以填充到 C 数据结构中,您可以直接使用该信息。

struct wavfile
{
char id[4]; // should always contain "RIFF"
int totallength; // total file length minus 8
char wavefmt[8]; // should be "WAVEfmt "
int format; // 16 for PCM format
short pcm; // 1 for PCM format
short channels; // channels
int frequency; // sampling frequency
int bytes_per_second;
short bytes_by_capture;
short bits_per_sample;
char data[4]; // should always contain "data"
int bytes_in_data;
};

FILE * fp = fopen("file.wav", "rb");
wavfile info;
if (fp) {
fread(&info, 1, sizeof(wavfile), fp);
// try to read data here
}

我认为WAV文件中没有帧,只要确定每个采样点的长度,即wavinfo.bits_per_sample/8即可。如果值为 2,我们可以读取一个 short 作为示例。

Here是一个博客,还有一些示例代码,但我想你仍然需要进行一些调试。

关于c++ - 获取 wav 文件的帧和样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25634377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com