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

How do you convert a stream of PCM audio samples to volume?

我可以获得 unsigned 32 bit ints from a WAV file.

的数组
65509
65402
65518
65520
65521
...

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

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

所以有样本流,但是有频道。因此,您需要分秒必争,将立体声转换为单声道。同样,如果您只想播放 - 只需将播放器配置为使用立体声。

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

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

希望对你有帮助。

您可能希望更准确地定义音量水平以获得特定的公式。 Loudness of PCM stream question/answer 给出了一个流行的选项。

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

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

另一个 specification/algorithm 被这个答案提到:get loudness level from raw data received from microphone in DirectShow