如何使用fread和fwrite从文件中读取pcm样本?

时间:2011-03-11 05:24:36

标签: c audio wav pcm fread

我想使用fread从文件中读取pcm样本,并希望确定样本的信号强度。我该怎么做呢?

为了阅读,1 pcm样本有多少字节?我可以一次读取超过1 pcm的样本吗?  这适用于WAV和AAC文件。

2 个答案:

答案 0 :(得分:1)

您必须了解WAV文件(甚至更多AAC文件)并不完全相同。我只会解释一下WAV文件,你希望能够理解它与AAC文件的关系。正如您所指出的,WAV文件具有PCM编码数据。然而,它可以是:8位,16位,32位,......单声道,立体声,5.1,......,8kHz,16kHz,44.1kHz等。根据这些值,您必须解释数据(例如,当用fread() - 函数读取它时,会有所不同。因此WAV文件有一个标题。您必须首先以标准方式读取该标题(我不知道详细信息)。然后你知道如何阅读实际数据。由于它并不那么容易,我建议您使用那些库,为您阅读WAV文件,例如http://www.mega-nerd.com/libsndfile/。当然你也可以谷歌或使用SO来寻找其他人。或者你这么做,并找出WAV文件头的样子并首先解码数据,然后转到实际的PCM编码数据。

答案 1 :(得分:0)

我没有处理过WAV文件的经验,但是一旦从mp3文件中读取数据。至于mp3文件,每个576 pcm的样本被编码成一个帧。所有帧都直接存储在一个文件中,并带有一些辅助信息。处理编码数据时,我从mp3文件中读取二进制数据并存储在缓冲区中,解码缓冲数据并提取对我有意义的数据。

我认为处理wav文件(根据我的理解存储pcm样本)并没有太大的不同。您可以直接从文件中读取二进制数据,并根据wav编码规范执行一些转换。

文件本身甚至不知道哪种数据类型的数据。您可以将文件中的所有内容作为字节(甚至是纯文本),从文件中读取字节,自己解释二进制数据。