PyAudio流音量偶尔减半、转换字节除以2产生白噪声问题咨询
问题根因
你遇到的白噪声问题核心是WAV格式的PCM数据解析/序列化规则不匹配,具体有两处错误:
- 16位WAV音频的采样值是有符号整数,你调用
int.from_bytes和to_bytes时没有指定signed=True,默认按无符号整数处理,负数采样值会被解析为超大的正整数 - 绝大多数WAV文件的字节序是小端(little-endian),你错误指定为大端(big)
你自定义生成的音频之所以除以2正常,是因为你生成的采样值全部为正,且数值范围刚好适配错误的解析规则,不会触发符号和字节序的问题;而直接赋值原wav的v值时,你是错误解析后又错误序列化,相当于字节原样输出,所以播放也正常,只有修改v值的时候才会暴露错误。
修复方案
修改两处代码即可:
- 调整WAV采样值的解析逻辑
把
v = int.from_bytes(data2, 'big')
修改为
v = int.from_bytes(data2, byteorder='little', signed=True)
- 调整整数字节序列化逻辑
把
data = int(n).to_bytes(2, 'big')
修改为
data = int(n).to_bytes(2, byteorder='little', signed=True)
- 可选优化:音量减半改用整数运算避免浮点截断误差,把
n = int(v / 2)改为n = v // 2
内容的提问来源于stack exchange,提问作者Michael Lowe
相关产品推荐
相关产品推荐

