Python中如何将多频率合成的音频数据写入WAV文件?
WAV文件写入失败的解决方法
你的代码存在几个关键问题,修正后的代码及问题说明如下:
问题分析
- 参数设置顺序错误:
setparams需要在写入帧之前调用,否则文件头参数未初始化就写入数据会导致文件损坏。 - 数据打包错误:
struct.pack传入列表时需要用*解包,否则会把整个列表当作单个参数传入,引发打包失败。 - 写入帧参数错误:
writeframes需要传入打包后的二进制数据,而非样本数量,且不能将其返回值(None)重新赋值给data。 - 未定义变量:
nframes和sampling_rate需要确保已正确定义,nframes应等于样本数量num_samples。
修正后的代码
import wave import struct # 确保sampling_rate已定义,比如48000 sampling_rate = 48000 file = "total.wav" comptype = "NONE" compname = "not compressed" num_samples = 48000 nchannels = 1 sampwidth = 2 nframes = num_samples # 定义nframes为样本数量 wav_file = wave.open(file, 'w') # 先设置文件参数 wav_file.setparams((nchannels, sampwidth, int(sampling_rate), nframes, comptype, compname)) # 打包数据:注意用*data解包你的音频数据列表 # 假设data是你合成后的音频数据列表,值范围要符合sampwidth=2的要求(-32768到32767) packed_data = struct.pack(f'{num_samples}h', *data) # 写入打包后的二进制数据 wav_file.writeframes(packed_data) # 记得关闭文件 wav_file.close()
额外注意事项
- 确保你的合成音频数据
data中的每个值都在16位有符号整数范围内(-32768 到 32767),因为sampwidth=2对应16位PCM格式,超出范围会导致音频失真或写入失败。 - 检查
sampling_rate是否为有效数值(比如44100、48000等标准采样率)。
内容的提问来源于stack exchange,提问作者thiccdan69
相关产品推荐
相关产品推荐

