AudioKit多路由音频输出技术求助:同时输出至耳机与USB/HDMI
没问题!我来帮你搞定AudioKit的多路由输出设置——把同一AKNode音频流同时送到USB声卡(通过相机套件)和耳机的需求,用Swift 4就能轻松实现。
核心思路
AudioKit支持iOS的AVAudioSession.Category.multiRoute会话类别,这个类别允许音频同时输出到多个已连接的设备(比如USB声卡+耳机)。我们只需要正确配置音频会话,再把你的音频流路由到AudioKit的输出即可,甚至可以单独控制不同设备的音量。
完整Swift 4代码示例
1. 基础配置(自动输出到所有设备)
如果不需要单独控制各设备音量,这个简单版本就能满足需求:
import AVFoundation import AudioKit class MultiRouteAudioPlayer { var audioSource: AKNode! // 替换成你自己的AKNode(比如AKPlayer、AKOscillator等) var mainMixer: AKMixer! init() { // 第一步:配置多路由音频会话 do { let session = AVAudioSession.sharedInstance() // 设置类别为multiRoute,允许和其他音频混合 try session.setCategory(.multiRoute, mode: .default, options: [.mixWithOthers]) try session.setActive(true) } catch let error { print("音频会话配置失败: \(error.localizedDescription)") return } // 第二步:初始化你的音频源(这里用AKPlayer举例) guard let audioURL = Bundle.main.url(forResource: "demo-audio", withExtension: "wav") else { print("找不到音频文件!") return } audioSource = try! AKPlayer(url: audioURL) (audioSource as! AKPlayer).isLooping = true // 第三步:用混音器统一管理音频流 mainMixer = AKMixer(audioSource) // 第四步:设置AudioKit输出为混音器,启动AudioKit AudioKit.output = mainMixer do { try AudioKit.start() } catch let error { print("AudioKit启动失败: \(error.localizedDescription)") } } func startPlayback() { (audioSource as! AKPlayer).play() } }
2. 进阶配置(单独控制各设备音量)
如果需要给USB声卡和耳机设置不同的音量,我们可以为每个输出设备创建独立的AKAudioOutputNode:
// 在上面的类中添加以下方法和属性 var usbOutputNode: AKAudioOutputNode? var headphoneOutputNode: AKAudioOutputNode? // 获取所有可用输出设备 private func getAvailableOutputDevices() -> [AVAudioDevice] { let session = AVAudioSession.sharedInstance() return session.availableOutputs?.compactMap { $0.device } ?? [] } // 初始化多设备输出 private func setupMultiDeviceOutput() { let outputDevices = getAvailableOutputDevices() guard outputDevices.count >= 2 else { print("未检测到足够的输出设备!") return } // 可以通过设备名称区分USB声卡和耳机,避免依赖顺序 let usbDevice = outputDevices.first { $0.name.contains("USB") } let headphoneDevice = outputDevices.first { $0.name.contains("Headphones") } guard let usbDev = usbDevice, let headphoneDev = headphoneDevice else { print("无法识别目标输出设备!") return } usbOutputNode = AKAudioOutputNode(device: usbDev) headphoneOutputNode = AKAudioOutputNode(device: headphoneDev) // 将混音器连接到两个输出节点 mainMixer.connect(to: usbOutputNode!) mainMixer.connect(to: headphoneOutputNode!) // 启动输出节点 do { try usbOutputNode?.start() try headphoneOutputNode?.start() } catch let error { print("启动输出节点失败: \(error.localizedDescription)") } // 单独设置音量 usbOutputNode?.volume = 0.8 headphoneOutputNode?.volume = 0.5 } // 修改init方法,调用setupMultiDeviceOutput init() { // ... 保留之前的会话配置、音频源初始化代码 ... // 替换原来的AudioKit.output设置,改为手动配置多设备输出 // AudioKit.output = mainMixer setupMultiDeviceOutput() // 启动AudioKit do { try AudioKit.start() } catch let error { print("AudioKit启动失败: \(error.localizedDescription)") } }
关键注意事项
- AudioKit版本适配:确保你使用的是兼容Swift 4的AudioKit版本(推荐AudioKit 4.x系列,因为AudioKit 5+仅支持Swift 5及以上)。
- 权限配置:在
Info.plist中添加NSMicrophoneUsageDescription键值对,因为multiRoute类别默认需要麦克风权限(即使你只做音频播放)。 - 设备检测:测试时确保USB声卡通过相机套件正确连接,耳机已插入,iOS会自动识别多路由设备;如果设备未被识别,重启设备或重新连接试试。
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

