You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:45:09