如何使用python从音频wav文件获取rms?

时间:2019-07-19 05:35:04

标签: python audio wav rms

如何使用宽度2来获得无错误的结果?

宽度为2,但会出现错误。

如果将其更改为1,我可以从代码中获得结果,但是它不正确。

import wave
import contextlib
import audioop

fname = "some.wav"

with contextlib.closing(wave.open(fname,'r')) as f:

    frames = f.getnframes()
    rate = f.getframerate()
    duration = frames / float(rate)
    width = f.getsampwidth()
    channel = f.getnchannels()
    size = width*channel
    # f.rewind()
    wav = f.readframes(f.getnframes())
    # print(duration)

print(audioop.rms(str(wav).encode("ascii"),2))
  

“ audioop.error:不是全部帧”

2 个答案:

答案 0 :(得分:0)

我不使用Python,所以请告诉我它是否可以解决...

根据Audioop docs

  

“它对由8、16或32位宽的有符号整数样本组成的声音片段进行操作。”

请考虑以下内容:

  • f.getsampwidth()以字节为单位给出宽度,因此您有 2个字节

  • 1个字节包含8位,因此2个字节的宽度为 16位

尝试方式:

print(audioop.rms(str(wav).encode("ascii"),16))

答案 1 :(得分:0)

可能会晚一点,但是我遇到了另一个问题的答案: audioop.rms() - why does it differ from normal RMS?

也许尝试使用:

audioop.rms(wav, 2)

其中2代表字节数(在本例中为int16)