Ubuntu下PyAudio播放音频遇设备占用报错的解决方法咨询
解决Ubuntu下PyAudio音频被占用时无法播放的问题
方法1:指定具体的音频输出设备
当系统默认设备被占用时,直接指定一个可用的输出设备即可:
- 先运行以下代码列出所有可用音频设备:
import pyaudio p = pyaudio.PyAudio() for i in range(p.get_device_count()): info = p.get_device_info_by_index(i) print(f"设备索引: {i}, 名称: {info['name']}, 输出通道数: {info['maxOutputChannels']}") p.terminate()
- 找到其中支持输出的设备索引,在播放代码中添加
device_index参数:
import pyaudio import wave wf = wave.open("a.wav", 'rb') p = pyaudio.PyAudio() # 替换成你找到的可用设备索引 stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True, device_index=1) data = wf.readframes(1024) while data != b'': stream.write(data) data = wf.readframes(1024) stream.stop_stream() stream.close() p.terminate() wf.close()
方法2:强制PortAudio使用共享模式
Ubuntu中PyAudio依赖PortAudio,通过设置环境变量禁用独占模式,允许音频设备共享:
import os # 强制使用ALSA后端并禁用独占模式 os.environ['PA_ALSA_PLAYBACK_DEVICE'] = 'default' os.environ['PA_ALSA_EXCLUSIVE'] = '0' import pyaudio import wave wf = wave.open("a.wav", 'rb') p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) data = wf.readframes(1024) while data != b'': stream.write(data) data = wf.readframes(1024) stream.stop_stream() stream.close() p.terminate() wf.close()
方法3:替换为更适配Linux的音频库
如果PyAudio的问题始终无法解决,换用以下轻量库:
- simpleaudio:安装命令
pip install simpleaudio,示例代码:
import simpleaudio as sa wave_obj = sa.WaveObject.from_wave_file("a.wav") play_obj = wave_obj.play() play_obj.wait_done() # 等待播放完成
- soundfile + sounddevice:安装命令
pip install soundfile sounddevice,示例代码:
import soundfile as sf import sounddevice as sd data, sample_rate = sf.read("a.wav") sd.play(data, sample_rate) sd.wait()
方法4:调整系统音频设置
检查系统是否限制了设备独占:
- 打开Ubuntu系统设置 → 声音
- 点击当前输出设备右侧的齿轮图标进入详情
- 取消勾选“独占模式”选项,允许多个应用同时使用该设备
内容的提问来源于stack exchange,提问作者user22474951
相关产品推荐
相关产品推荐

