使用PyAudio播放wav文件时出现wave.Error: unknown format:3报错如何解决
问题修复方案
错误根因
wave.Error: unknown format: 3 报错指向WAV文件编码不兼容问题:错误码3对应32位IEEE浮点编码的WAV格式,Python标准库的wave模块仅支持线性PCM整数编码(格式标签为1,常见的8位、16位、24位PCM都属于这类)的WAV文件,无法直接读取浮点编码的WAV。
修复方法
方法一:转码WAV文件(操作最简单)
将你的DP.wav转换为16位PCM编码即可兼容原代码,用免费工具Audacity就能完成:
- 用Audacity打开目标WAV文件
- 点击顶部菜单栏「文件」→「导出」→「导出为WAV」
- 保存弹窗的编码选项选择「Signed 16-bit PCM」后保存,用新生成的WAV运行原代码即可。
提示:原代码存在Python3适配问题:
wave.readframes在Python3中返回bytes类型,判断data != ''永远为真,播放完后会进入死循环,需要把循环条件改成while data != b''。
方法二:修改代码适配浮点编码WAV
不想转码的话可以替换音频读取库,用支持浮点编码的soundfile库读取WAV,搭配pyaudio播放即可:
- 先安装依赖库:
pip install soundfile numpy pyaudio
- 替换为以下代码:
import pyaudio import soundfile as sf import numpy as np class AudioFile: chunk = 1024 def __init__(self, file): """ 初始化音频流 """ # soundfile支持浮点编码WAV读取 self.audio_data, self.sample_rate = sf.read(file, dtype='float32') self.channel_num = self.audio_data.shape[1] if len(self.audio_data.shape) > 1 else 1 self.p = pyaudio.PyAudio() self.stream = self.p.open( format = pyaudio.paFloat32, channels = self.channel_num, rate = self.sample_rate, output = True ) # 按chunk大小拆分音频 self.frame_list = np.array_split(self.audio_data, np.ceil(len(self.audio_data)/self.chunk)) self.play_index = 0 def play(self): """ 播放完整音频 """ while self.play_index < len(self.frame_list): self.stream.write(self.frame_list[self.play_index].tobytes()) self.play_index += 1 def close(self): """ 优雅关闭资源 """ self.stream.close() self.p.terminate() # 调用示例 a = AudioFile("DP.wav") a.play() a.close()
内容的提问来源于stack exchange,提问作者Ingeneravit
相关产品推荐
相关产品推荐

