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

问题描述:

我想使用fread从文件中读取pcm样本,并希望确定样本的信号强度。我该如何处理它?如何使用fread和fwrite从文件读取pcm样本?

对于阅读,多少字节构成1 pcm样本?我可以一次读取超过1 pcm的样本吗? 这是用于WAV和AAC文件。

+0

什么样的文件? WAV? MP3? AAC? – selbie 2011-03-11 05:27:23

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

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

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

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