wave库readframes()输出是否为十六进制音频样本?立体声样本解析咨询
关于wave库readframes方法的两个问题解答
问题1:使用wave库的readframes(n)方法获取的结果,打印后是否以十六进制形式展示音频样本?
wave.readframes(n)返回的是二进制字节对象(bytes),打印时Python会用转义的十六进制格式(比如\xfb\xff)来表示不可打印的字节,但这只是Python对bytes对象的默认显示方式,并非直接输出十六进制字符串。- 如果需要真正的十六进制字符串形式,需要手动转换,示例代码:
import wave with wave.open('audio.wav', 'rb') as track: frames = track.readframes(1) print(frames) # 输出类似 b'\xfb\xff\xfb\xfe' print(frames.hex()) # 输出 'fbfffbfe'
问题2:当执行track.readframes(1)打印第一帧音频结果时,得到b'\xfb\xff\xfb\xfe'。该音频为立体声,包含2个声道且每个声道有1个样本,请问左声道样本是否为'fbff',右声道样本是否为'fbfe'?
- 答案是对的。WAV格式的立体声音频采用交叉存储的方式:左声道样本在前,右声道样本在后。
- 从返回的
b'\xfb\xff\xfb\xfe'来看,每个声道的样本占2字节(说明是16位PCM编码),拆分后:- 左声道样本:前2字节
b'\xfb\xff',对应十六进制字符串就是'fbff' - 右声道样本:后2字节
b'\xfb\xfe',对应十六进制字符串就是'fbfe'
- 左声道样本:前2字节
- 补充:16位PCM样本的字节序通常是小端(little-endian),如果要转换为实际的音频数值,需要考虑字节序,比如用
struct.unpack('<h', b'\xfb\xff')[0]来解析左声道的实际样本值。
内容的提问来源于stack exchange,提问作者stabpaokara
相关产品推荐
相关产品推荐

