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

如何在OSX上编程录制指定应用的音频输出?是否需实现音频驱动?

在 macOS 上编程录制指定应用的音频输出

能否实现?

完全可以。macOS 提供原生系统级 API,支持精准捕获单个应用的音频输出,不管是Chrome播放视频、Apple Music播放音乐这类场景,都能单独录制目标应用的音频流。

是否需要开发音频驱动?

不需要。利用系统自带的Core Audio框架就能完成,核心逻辑是定位目标应用对应的音频输出节点,再将其音频流路由到你的录制程序中:

  • 通过AudioObjectPropertyListener等API枚举系统内所有音频对象,找到目标应用在系统音频会话中注册的音频输出设备/节点(每个发声的应用都会留下专属标识);
  • 借助AudioUnit或AudioGraph API,将目标节点的音频流导向录制逻辑,完成音频数据的捕获、编码与存储。

举个简单的Swift代码片段,用于枚举系统音频设备并定位目标应用:

import CoreAudio

// 构建音频属性地址,用于获取系统所有音频设备
var address = AudioObjectPropertyAddress(
    mSelector: kAudioHardwarePropertyDevices,
    mScope: kAudioObjectPropertyScopeGlobal,
    mElement: kAudioObjectPropertyElementMaster
)

// 获取设备数量
var deviceCount: UInt32 = 0
var size = UInt32(MemoryLayout<UInt32>.size)
AudioObjectGetPropertyData(AudioObjectID(kAudioObjectSystemObject), &address, 0, nil, &size, &deviceCount)

// 存储所有设备ID
var devices = [AudioObjectID](repeating: 0, count: Int(deviceCount))
size = UInt32(MemoryLayout<AudioObjectID>.size * Int(deviceCount))
AudioObjectGetPropertyData(AudioObjectID(kAudioObjectSystemObject), &address, 0, nil, &size, &devices)

// 遍历设备,查找目标应用对应的音频输出
for device in devices {
    var nameBuffer = [CChar](repeating: 0, count: 256)
    address.mSelector = kAudioDevicePropertyDeviceNameCFString
    size = UInt32(MemoryLayout<CFString>.size)
    _ = AudioObjectGetPropertyData(device, &address, 0, nil, &size, &nameBuffer)
    let deviceName = String(cString: nameBuffer)
    
    // 匹配目标应用,比如查找Chrome的音频输出
    if deviceName.contains("Chrome") {
        // 此处可添加逻辑,将该设备的音频流导入录制模块
        print("找到目标应用音频设备:\(deviceName)")
        break
    }
}

注意事项

  • 必须在应用的Info.plist中添加NSMicrophoneUsageDescription字段,说明音频录制用途,否则系统会拒绝权限请求;
  • macOS 13+(Ventura及以后)隐私限制更严格,需要在系统设置「隐私与安全性」中给应用授予「音频录制」权限;
  • 沙盒应用需额外在沙盒配置中开启音频捕获相关权限。

内容的提问来源于stack exchange,提问作者grayondream

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:20:29