繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM