如何将 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 位 INT
s 看起来不太好。对于 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 音频样本流转换为音量?的主要内容,如果未能解决你的问题,请参考以下文章