如何将 AVAudioEngine 连接到 Lightning Port 音频输入?

Posted

技术标签:

【中文标题】如何将 AVAudioEngine 连接到 Lightning Port 音频输入?【英文标题】:How do I connect AVAudioEngine to a Lightning Port audio input? 【发布时间】:2015-03-20 19:39:49 【问题描述】:

我想将我的电吉他连接到我的应用。我有硬件(Line6 Sonic Port)将音频从我的吉他传递到我的 iPhone。我已经想出了如何让我的耳机播放音频,但音频来自我的耳机麦克风,而不是闪电端口输入。 如何以编程方式查找 Lightning Port 音频输入,而不是通过耳机麦克风获取音频?

这是我迄今为止尝试过的:

self.audioEngine = AVAudioEngine()

let input = self.audioEngine.inputNode
let mixer = self.audioEngine.mainMixerNode
let output = self.audioEngine.outputNode

self.audioEngine.inputNode.installTapOnBus(0, bufferSize: 128, format: input.inputFormatForBus(0))  (buffer, time) -> Void in
    //


self.audioEngine.connect(input, to: mixer, format: input.inputFormatForBus(0))
self.audioEngine.connect(mixer, to: output, format: mixer.inputFormatForBus(0))

self.audioEngine.prepare()
self.audioEngine.startAndReturnError(nil)

当我运行它时,我听到了音频 - 但它来自我的耳机麦克风,而不是吉他。如何连接来自 Lightning 端口的音频?

为了快速说明,这里是我正在使用的硬件:

【问题讨论】:

我之前没用过AVAudioEngine。我也没有使用过 Line6 声波端口 - 任何一个都可以。我在 Apogee Jam 中使用了早期的 Core Audio 框架,并且在连接时它“正常工作”。耳机是否连接到 Sonic 端口(我看到侧面有一个插孔)?你能改变输入节点上的输入节点/设置吗? 您的输入设备是否显示在AVAudiosession.availableInputs中? 【参考方案1】:

要连接到特定的音频输入,您需要使用setPreferredInput:error: 方法配置AVAudioSessionsharedInstance

这是在 Objective-C 中如何完成的:

AVAudioSession *sharedSession = [AVAudioSession sharedInstance];
NSArray *availableInputs = [sharedSession availableInputs];
[availableInputs enumerateObjectsUsingBlock:^(AVAudioSessionPortDescription *portDescription, NSUInteger idx, BOOL *stop) 
    if (portDescription.portType == AVAudioSessionPortUSBAudio) 
        [sharedSession setPreferredInput:portDescription error:nil];
    
];

要了解更多信息,请查看:

AVAudioSession documentation Technical Q&A QA1799: AVAudioSession - Microphone Selection

【讨论】:

【参考方案2】:

iOS 通常会从插入的最后一个端口路由音频输入和输出。由于您插入了耳机,因此它就是用于录制的端口。拔下耳机,插上闪电,它会使用该路径进行音频录制和播放。

【讨论】:

以上是关于如何将 AVAudioEngine 连接到 Lightning Port 音频输入?的主要内容,如果未能解决你的问题,请参考以下文章

iOS8 AVAudioEngine 如何将麦克风输入路由到(底部)扬声器输出?

AVAudioEngine.connect 上的 CoreAudio 错误和崩溃

匹配 AVAudioEngine 的输入和输出硬件设置

将AVAudioSourceNode连接到AVAudioSinkNode不起作用

AVAudioEngine 离线渲染:仅在连接耳机时静音输出

AVAudioEngine.start() 中的崩溃,即使它包含在 do/catch 中