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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:08:46