如何在不使用音频库的情况下编辑原始PCM音频数据?

9 投票
5 回答
14993 浏览
提问于 2025-04-15 11:28

我想要精确提取PCM WAV文件中的某些部分,甚至到每一个音频样本的级别。大多数音频模块似乎都依赖于特定平台的音频库。我想要做一个跨平台的解决方案,而且速度不是问题,有没有什么原生的Python音频模块可以做到这一点?

如果没有的话,我就得自己解析PCM的二进制数据。虽然我相信我能很容易找到PCM的规格,而且原始格式也比较简单,但我之前从来没有在Python中处理过二进制数据。有没有什么好的资源可以教我怎么做?如果能和音频相关就更好了。

5 个回答

1

你的解决方案一定要是纯Python写的吗?还是说你可以接受一些能和不同平台上的本地音频库一起工作的东西(这样就能在多个平台上使用)?在这个链接里有几个这样的例子:http://wiki.python.org/moin/PythonInMusic

5

我之前只用C++和Java写过PCM读取器,但这种格式其实挺简单的。你可以在这里找到一个不错的描述:http://ccrma.stanford.edu/courses/422/projects/WaveFormat/

接下来,你只需要把它读进来(这就是二进制文件读取,http://www.johnny-lin.com/cdat_tips/tips_fileio/bin_array.html),然后处理得到的数组就行了。你可能需要用一些位移操作来调整对齐(https://docs.python.org/reference/expressions.html#shifting-operations),但根据你读取的方式,可能不需要这样做。

总的来说,我还是倾向于David的方法。

7

我看了这个问题和回答,感觉我一定漏掉了什么特别明显的东西,因为没有人提到以下两个模块:

  • audioop:用来处理原始音频数据
  • wave:用来读写WAV格式的音频文件

也许我来自一个平行宇宙,而Guido的时间机器其实是个时空机器呢 :)

如果你需要示例代码,随时可以问我。

附注:假设采样率是48kHz,一个视频帧在24/1.001==23.976023976…帧每秒的情况下,长度是2002个音频样本,而在25帧每秒的情况下,长度是1920个音频样本。

撰写回答