读取 PCM 音频文件有时会给出错误的样本

问题描述

我有一个 16 位、48kHz、1 声道(单声道)PCM 音频文件(没有标题,但无论如何它与 WAV 标题相同)并且我可以使用诸如 Audacity 之类的软件正确读取该文件,但是当我尝试以编程方式(在 C++ 中)读取它时,有些示例似乎不合适,而大多数示例比较 Audacity 值时正确。

我读取PCM文件的过程如下:

  1. 将 PCM 的字节数组转换为短数组以通过位移获得可读值(这里的字节顺序是小端)
for(int i = 0; i < bytesSize - 1; i += 2)
    shortValue[i] = bytes[i] | bytes[i + 1] << 8;

注意bytes 是 PCM 文件二进制内容char 数组。而 shortValue一个 short 数组。

  1. 通过除以 short 的最大值,将短值转换为浮点数组中的振幅级别 (32767)
for(int i = 0; i < shortsSize ; i++)
    amplitude[i] = static_cast<float>(shortValue[i]) / 32767;

这显然不是最佳代码,我可以在一个循环中完成,但为了解释的唯一目的,我将两个步骤分开。

那么究竟发生了什么,当我试图在我的最后一个阵列中找到非常大的幅度变化时,它显示我的样本不正确?就像在 Audacity 中一样,注意波浪是如何完全平滑的,以及以绿色指向的 样本 276,467 如何比以红色指向的下一个样本略低一点,后者应该在 -0.17 左右。

Audacity screenshot of a normal wave with two samples pointed out

但是,从我的代码中读取时,我得到了一个完全错误的红色样本值(-0.002),同时仍然得到了一个很好的绿色样本值(-0.17 左右),红色样本之后的样本也是正确(也在 -0.17 左右)。

screenshot of Visual Studio debugging watch showing wrong amplitude value for the red sample

我真的不明白发生了什么以及 Audacity 是如何正确读取这些字节的,我尝试了多个 PCM/WAV 文件,但得到了相同的结果。任何帮助将不胜感激!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)