【问题标题】:How to set iOS app to use usb audio for input and output to internal speakers如何将 iOS 应用程序设置为使用 USB 音频输入和输出到内部扬声器
【发布时间】:2014-08-12 08:36:54
【问题描述】:

我有 2 种不同品牌的吉他适配器,它们使用闪电连接器连接到我的 iPhone

当适配器 1 插入时,设备变成一个 USB 音频麦克风,并通过我 iPhone 的扬声器播放声音,因为适配器不包含耳机插孔

当适配器 2 插入时,设备变成一个 USB 音频麦克风,但通过适配器上的耳机插孔播放声音。

我正在尝试编写一个适用于适配器 2 的应用程序,但我不想将声音输出到适配器的耳机插孔,而是想通过 iPhone 的扬声器进行路由。

下面的代码应该可以工作,但我发现使用 AVAudioSessionPortOverrideSpeaker 选项调用 AVAudioSessionPortOverride 并且音频会话的类别是 AVAudioSessionCategoryPlayAndRecord 会导致音频使用内置扬声器和麦克风,而不管其他设置,基本无视setPreferredInput

我不太明白适配器 1 如何设法从 USB 音频获取输入并输出到扬声器,但由于上述限制,我的应用程序不能。有人知道解决方案吗?

AVAudioSession* session = [AVAudioSession sharedInstance];
//Set the audioSession category. Needs to be Record or PlayAndRecord to use audioRouteOverride:
[session    setCategory:AVAudioSessionCategoryPlayAndRecord 
            withOptions:AVAudioSessionCategoryOptionMixWithOthers 
            error:nil];

//set the audioSession override
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker 
error:nil];

//activate the audio session
[session setActive:YES error:nil];

//set input to usb
for (AVAudioSessionPortDescription *destPort in session.availableInputs){
    if ([destPort.portType isEqualToString:AVAudioSessionPortUSBAudio]) {
        [setPreferredInput:(AVAudioSessionPortDescription *)inPort
                error:(nil)outError
                session setPreferredInput:destPort error:nil];
    }
}

【问题讨论】:

  • 你能把session.availableInputs的日志放上去吗?
  • adapter1 只能输入吗?
  • 是的,它只能向iOS设备输入音频
  • 你检查错误参数是否显示了什么?
  • 我认为您发布的代码中有些东西混淆了,可能是在格式化期间。最后一条语句包含两次 setPreferredInput,所以这里的语法看起来是错误的:[setPreferredInput:(AVAudioSessionPortDescription *)inPort error:(nil)outError session setPreferredInput:destPort error:nil];

标签: ios iphone objective-c avfoundation avaudiosession


【解决方案1】:

这有点远,但你试过了吗..

[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]

..而不是overrideOutputAudioPort:?

【讨论】:

  • 谢谢,但我得到了相同的结果。我认为苹果不允许我们从 USB 获取输入然后输出到扬声器..
【解决方案2】:

我认为只有在USB设备没有音频输出组件的情况下,才能通过USB设备输入和通过扬声器输出。

我找不到任何说明这一点的文档,但我的推理如下:

混合和匹配音频设备是通过AVAudioSessionCategoryPlayAndRecord 的通用版本完成的,即所谓的多路由类别 (AVAudioSessionCategoryMultiRoute) 及其在AVAudioSession.h 中的文档说

  1. 输入仅限于后输入端口。
  2. AVAudioSessionPortBuiltInSpeaker 只允许在没有连接其他符合条件的输出时使用

第 1 点不是问题,但第 2 点不允许您的适配器 2 方案。

NB允许适配器 1 和 2 与 USB 输入和线路输出或耳机一起使用。这对你有用吗?

【讨论】:

  • 感谢您的来信。不,我确实需要通过设备扬声器。至少你支持我的发现,我试图实现的路线是不可能的
  • 我同意这可能(目前)不可能。我有一个应用程序,我“更喜欢”通过设备麦克风获取输入,并通过蓝牙将输出音频推送到外部立体声系统。希望我们中的一个人能找到正确的解决方案,听起来他们可能是类似的问题。
  • 如何配置 USB 输入和耳机输出?
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
相关资源
最近更新 更多