我想使用 fread 从文件中读取 pcm 样本,并想确定样本的信号强度。我该怎么做?
对于读取,多少字节构成 1 pcm 样本?我可以一次读取超过 1 pcm 的样本吗?这适用于 WAV 和 AAC 文件。
您必须了解 WAV 文件(甚至 AAC 文件)并不完全相同。我只会解释 WAV 文件,希望你能理解它是如何使用 AAC 文件的。正如您所指出的,WAV 文件具有 PCM 编码的数据。但是,可以是:8 位、16 位、32 位、...单声道、立体声、5.1、...、8kHz、16kHz、44.1kHz 等。根据这些值,您必须解释数据(例如,当使用 fread()-function) 以不同方式读取它时。因此 WAV 文件有一个标题。您必须先以标准方式阅读该标题(我不知道细节)。然后你就知道如何读取实际数据了。由于这并不容易,我建议您使用那里的库,为您读取 WAV 文件,例如http://www.mega-nerd.com/libsndfile/. 当然你也可以google或者用SO来找别人。或者你用艰难的方法来找出 WAV 文件头的样子并首先解码该数据,然后继续处理实际的 PCM 编码数据。
我没有处理 WAV 文件的经验,但曾经从 mp3 文件中读取数据。对于 mp3 文件,每 576 pcm 样本编码成一帧。所有的帧都直接存储到一个文件中,并带有一些辅助信息。在处理编码数据时,我从 mp3 文件中读取二进制数据并存储在缓冲区中,解码缓冲数据并提取对我有意义的内容。
我认为处理 wav 文件(根据我的理解存储 pcm 样本)并没有太大的不同。您可以直接从文件中读取二进制数据并根据 wav 编码规范进行一些转换。
文件本身甚至不知道其中的数据是什么格式的数据。您可以将文件中的所有内容都作为字节(甚至是纯文本),从文件中读取字节并自己解释二进制数据。