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

Posted

技术标签:

【中文标题】如何使用 fread 和 fwrite 从文件中读取 pcm 样本?【英文标题】:how to read pcm samples from a file using fread and fwrite? 【发布时间】:2011-03-11 05:24:35 【问题描述】:

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

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

【问题讨论】:

什么样的文件?音频? MP3? AAC? 【参考方案1】:

您必须了解 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 编码数据。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于如何使用 fread 和 fwrite 从文件中读取 pcm 样本?的主要内容,如果未能解决你的问题,请参考以下文章

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

Linux read/write fread/fwrite两者区别

如何使用 fread 和 fwrite 函数读写二进制文件?

关于C/C++里FILE的fwrite和fread怎么用。

关于C语言fread的用法

fread 和 fwrite 有没有失败?如何处理?