[英]How to get rms from a audio wav file using python?
如何使用宽度 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:不是整数帧”
我不使用 Python,所以如果这些可能的选项之一修复它,请告诉我......
选项1:
根据Audioop 文档:
“它对由 8、16 或 32 位宽的带符号整数样本组成的声音片段进行操作。”
考虑以下:
f.getsampwidth()
以字节长度给出宽度,所以你有2 bytes 。
1 个字节包含 8 位,因此 2 个字节将是16位宽。
尝试如下:
print(audioop.rms(str(wav).encode("ascii"),16))
选项 2:
“如果我将其更改为
1
,我可以从代码中得到结果,但它是不正确的。”
也许原始行: print(audioop.rms(str(wav).encode("ascii"),2))
是正确的,真正的问题是not enough bytes
除以 2(宽度)。
确保 WAV'a 音频格式确实是 16 位和/或立体声。
可能有点晚了,但我在另一个问题上找到了答案: audioop.rms() - 为什么它与普通 RMS 不同?
也许尝试使用:
audioop.rms(wav, 2)
其中 2 表示字节数(在本例中为 int16)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.