如何在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
相关产品推荐
相关产品推荐

