如何对计算机播放的音频进行实时处理?
系统音频实时处理实现方案
一、核心问题:捕获系统播放的音频
PyAudio默认只能读取麦克风输入,要处理Spotify、YouTube这类系统播放的音频,首先得把系统输出的音频路由到一个虚拟输入设备,让音频库能捕获到它。
各平台设置方法
- Windows:启用系统自带的「立体声混音(Stereo Mix)」设备。打开「声音设置」→「更多声音设置」→「录制」标签,右键启用它(找不到的话更新声卡驱动试试)。之后PyAudio就能选这个设备作为输入源。
- macOS:用「音频MIDI设置」创建虚拟输入设备:添加多输出设备,把系统输出和虚拟输入绑定;或者用Soundflower这类工具直接创建虚拟音频回路。
- Linux:用PulseAudio命令创建虚拟回路:
之后在音频设置里把系统输出切换到VirtualSink,就能从VirtualSink.monitor捕获音频。pactl load-module module-null-sink sink_name=VirtualSink pactl load-module module-loopback source=VirtualSink.monitor
二、用PyAudio实现实时处理
搞定设备后,用PyAudio的回调模式就能实现低延迟实时处理,示例代码如下:
import pyaudio import numpy as np # 音频参数 CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 44100 def process_audio(in_data, frame_count, time_info, status): # 把字节数据转成可处理的numpy数组 audio_array = np.frombuffer(in_data, dtype=np.int16) # 这里写你的实时处理逻辑,比如降噪、EQ、特效等 processed = audio_array * 0.6 # 示例:降低音量 # 转回字节返回给系统播放 return (processed.tobytes(), pyaudio.paContinue) p = pyaudio.PyAudio() # 遍历设备找到虚拟输入设备(以Windows的Stereo Mix为例) input_dev_idx = None for i in range(p.get_device_count()): dev = p.get_device_info_by_index(i) if "Stereo Mix" in dev["name"]: input_dev_idx = i break # 打开音频流 stream = p.open( format=FORMAT, channels=CHANNELS, rate=RATE, input=True, input_device_index=input_dev_idx, frames_per_buffer=CHUNK, stream_callback=process_audio ) stream.start_stream() print("处理中,按回车停止...") input() stream.stop_stream() stream.close() p.terminate()
三、更简便的替代库
如果觉得PyAudio的设备配置麻烦,试试这些库:
- sounddevice:跨平台,支持直接枚举系统音频设备,API更简洁,同样支持回调式实时处理。
- pyffmpeg:可以通过FFmpeg命令捕获系统音频,再将输出管道到Python处理,适合复杂音频路由场景。
关键注意点
- 实时处理必须控制延迟:每个chunk的处理时间要小于该chunk的播放时长(比如1024帧/44100采样率≈23ms,处理耗时不能超过这个值),否则会出现卡顿。
- 不同平台的虚拟设备名称不一样,代码里的设备匹配逻辑要根据实际情况调整。
内容的提问来源于stack exchange,提问作者foshes
相关产品推荐
相关产品推荐

