Python中BytesIO处理WAV文件时头部额外添加字节的异常问题
WAV文件读写后字节数差异原因解析
场景
- 使用Python的wave包读取一个.wav文件
- 同样使用wave包将读取到的数据写入类文件对象BytesIO
- 对比原始音频数据与BytesIO中的数据是否一致
代码
import wave import io filepath = "my_file_path.wav" with wave.open(filepath) as f: params = f.getparams() data = f.readframes(f.getnframes()) bytes_io = io.BytesIO() wf = wave.open(bytes_io, "wb") wf.setnchannels(params.nchannels) wf.setsampwidth(params.sampwidth) wf.setframerate(params.framerate) wf.writeframes(data) bytes_io.seek(0) new_data = bytes_io.read() print(len(new_data)) print(len(data)) print(new_data[:-len(data)]) assert new_data[-len(data):] == data
运行输出
700740 700696 b'RIFF<\xb1\n\x00WAVEfmt \x10\x00\x00\x00\x01\x00\x01\x00\x80>\x00\x00\x00}\x00\x00\x02\x00\x10\x00data\x18\xb1\n\x00'
原因解析
字节数差异的核心原因很明确:
- 变量
data是从原始WAV文件中读取的纯音频帧数据,也就是WAV文件里data块的内容,完全不包含WAV文件的头部描述信息。 - 往BytesIO写入时,
wave模块会自动构建完整的WAV文件结构——包括RIFF标识、fmt格式块、data块标记这些标准WAV头部内容,所以new_data是一个完整的WAV文件(头部+音频帧数据),自然比data多了头部的字节数。
从运行输出也能直接验证:new_data[:-len(data)]输出的正是标准WAV文件的头部字节流,而assert new_data[-len(data):] == data能通过,说明new_data的末尾部分和原始音频帧数据完全一致。
内容的提问来源于stack exchange,提问作者HGLR
相关产品推荐
相关产品推荐

