You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:15:03