Mac下使用PyAudio+BlackHole录音出现PaMacCore -10863错误如何解决
错误触发原因
你遇到的报错:
||PaMacCore (AUHAL)|| Error on line 2500: err='-10863', msg=Audio Unit: cannot do in current context
对应macOS Core Audio框架的kAudioUnitErr_CannotDoInCurrentContext错误,触发原因如下:
- 核心是BlackHole虚拟音频设备做路由重定向时,状态切换存在毫秒级延迟,你现有代码初始化音频流后立刻启动采集,刚好赶上设备未就绪就会抛出该错误
- 短时间内反复启停录制、系统音频路由发生变更(比如切换输出设备、其他应用刚占用过BlackHole)都会大幅提高该错误的出现概率
- 你尝试重装PortAudio无法解决问题,因为错误根源是设备状态同步的时序不匹配,不是PortAudio本身的编译或版本问题
解决方案
方案1:增加启动重试逻辑
在打开流和启动流的步骤增加重试机制,每次重试间隔500ms,最多重试3次即可覆盖绝大多数设备未就绪场景,修改后的start_recording方法示例:
import time def start_recording(self, max_retry=3, retry_interval=0.5): # Use a stream with a callback in non-blocking mode retry_cnt = 0 while retry_cnt < max_retry: try: self._stream = self._pa.open(format=pyaudio.paInt16, channels=self.channels, rate=self.rate, input=True, frames_per_buffer=self.frames_per_buffer, stream_callback=self.get_callback()) self._stream.start_stream() return self except OSError as e: if "-10863" in str(e) and retry_cnt < max_retry - 1: retry_cnt += 1 time.sleep(retry_interval) continue raise e
方案2:显式指定BlackHole设备ID
避免PortAudio自动选择默认设备时的路由波动,先遍历获取BlackHole对应的设备ID,打开流时指定input_device_index参数:
# 新增获取BlackHole设备ID的方法 def get_blackhole_device_id(self): for i in range(self._pa.get_device_count()): dev_info = self._pa.get_device_info_by_index(i) if "BlackHole" in dev_info["name"] and dev_info["maxInputChannels"] >= self.channels: return i raise RuntimeError("未找到BlackHole输入设备") # 打开流时新增input_device_index参数 self._stream = self._pa.open(format=pyaudio.paInt16, channels=self.channels, rate=self.rate, input=True, input_device_index=self.get_blackhole_device_id(), frames_per_buffer=self.frames_per_buffer, stream_callback=self.get_callback())
方案3:辅助优化项
- 将
frames_per_buffer从1024调整为2048,降低对设备实时响应的要求 - 每次调用
stop_recording()后增加至少1s的等待时间,再启动下一次录制,避免设备忙 - 确认BlackHole的系统采样率设置和你代码中指定的44100一致,避免采样率转换带来的状态切换延迟
内容的提问来源于stack exchange,提问作者stef
相关产品推荐
相关产品推荐

