如何将 PCM 音频样本流转换为音量?

Posted

技术标签:

【中文标题】如何将 PCM 音频样本流转换为音量?【英文标题】:How do you convert a stream of PCM audio samples to volume? 【发布时间】:2017-01-07 17:16:22 【问题描述】:

我可以获得unsigned 32 bit ints from a WAV file的数组。

65509
65402
65518
65520
65521
...

如何将这些整数(或原始字节)转换为流的音量级别?

【问题讨论】:

发现这个overview of PCM uncompressed digital audio 很有帮助。 【参考方案1】:

您可能希望更准确地定义音量级别以获取特定公式。 Loudness of PCM stream question/answer 提供了一种流行的选项。

顺便说一句,您的 32 位 INTs 看起来不太好。对于 16+ 位/样本整数,样本通常以零为中心(也就是说,您要将它们视为有符号整数!)并且您问题中的值序列更像是 16 位 PCM 值错误地转换为 32 位忽略符号位。

无论哪种方式,您通常都有一个样本窗口,然后您将上面引用的公式应用于这些值以聚合到音量级别。滑动窗口可让您随时间变化音量。

这个答案提到了另一个规范/算法:get loudness level from raw data received from microphone in DirectShow。

【讨论】:

绘制我从库中得到的值你是对的,有些东西看起来很奇怪:imgur.com/scLU1jM (n16 = uint16(b[0]) + uint16(b[1]) << 8) @Xeoncross:签名__int16 是您对 16 位 PCM 的最佳猜测 移动到带符号的 int16 (int16(buf[0]) + int16(buf[1]) << 8) 确实可以生成更好的图表:imgur.com/UfXrxw0【参考方案2】:

Specification 表示样本可以存储为无符号字节或有符号整数。如果您只是将它们作为二进制数据传递 - 那没关系。信息就是信息。要将数据解释为音量级别,您需要知道这一点,BitsPerSample 显示了这一点。

所以有样本流,但有通道。所以你需要每一秒,将立体声转换为单声道。同样,如果您只想玩 - 只需将播放器配置为使用立体声。

对我来说,很难判断 ReadRawSample 是否允许访问字节流,还是访问特定块的行数据的字节数组?然后你需要知道已经处理了什么。但是,如果您确定那是实际样本 - 那么您就知道了。

Here is sample code that plays sound。您可以使用波形样本填充out 缓冲区,而不是从输入二进制流中读取数据。如果这不是您打算做的 - 您可以检查您的样本听起来是否符合您的预期。前段时间它对我帮助很大。

希望对你有帮助。

【讨论】:

以上是关于如何将 PCM 音频样本流转换为音量?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AudioQueue 播放 PCM 音频流音量低

可视化 PCM 样本的体积

混合 PCM 音频样本

您将如何测量一个音频样本中的低音量?

如何将wav音频文件格式为pcm转化为ima adpcm格式

iOS音频推流格式转换