覆盖 iOS 音频输出

Posted

技术标签:

【中文标题】覆盖 iOS 音频输出【英文标题】:Overriding iOS Audio Output 【发布时间】:2014-11-21 15:45:43 【问题描述】:

我一直在为我正在进行的一个项目做一些研究,并试图确定是否可以以编程方式重定向音频输出。假设我有一个通过 USB 连接到 iPhone 的混音器盒。此 USB 支持音频输入和输出路由。我知道如何“检测”外部 USB 配件是否连接到 iPhone,并且我知道如何检测 AVAudiosession 输入和输出。让我发布一些到目前为止我所理解的示例代码。

AVAudioSessionRouteDescription *route = [[AVAudioSession sharedInstance] currentRoute];

//Check the route inputs
for( AVAudioSessionPortDescription *inputDescription in route.inputs)

    NSLog(@"Port Name: %@", inputDescription.portName);
    NSLog(@"Port Description: %@", inputDescription.portType);

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Input Ports" message:[NSString stringWithFormat:@"INPUT PORT NAME NAME: %@ INPUT PORT DESCRIPTION: %@ INPUT ROUTE COUNT: %lu",inputDescription.portName, inputDescription.portType, (unsigned long)[route.outputs count]] delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok" , nil];
    [alert show];

    [self setInput:inputDescription];


if(route.inputs.count == 0)

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Input Ports" message:@"Did not detect any input connections" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok" , nil];

    [alert show];


//Check the route outputs
for( AVAudioSessionPortDescription *portDescription in route.outputs )
 
    NSLog(@"Port Name: %@", portDescription.portName);
    NSLog(@"Port Description: %@", portDescription.portType);

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Output Ports" message:[NSString stringWithFormat:@"OUTPUT PORT NAME NAME: %@ OUTPUT PORT DESCRIPTION: %@ OUTPUT ROUTE COUNT: %lu",portDescription.portName, portDescription.portType, (unsigned long)[route.outputs count]] delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok" , nil];
    [alert show];   

我也知道如何“覆盖” iOS 输出,以便它到达内置扬声器而不是耳机。

NSError *error;

AVAudioSession *session = [AVAudioSession sharedInstance];

BOOL overrideSuccess =  [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];

if(overrideSuccess)

    NSLog(@"Override succeeded");

理想情况下,我希望能够做这样的事情:

    检测任何输出并将其显示给用户。 (我能做到) 允许用户“选择”他们希望使用的输出 覆盖当前输出路由,将输出重定向到用户希望使用的设备。

这最后一步我不确定我能不能做到。

这个想法是让用户在不受 iOS 设备外部麦克风限制的情况下进行录音。如果我想要实现的目标是可能的,将不胜感激任何提示或建议。此外,我已经广泛阅读了 Apple 文档,但无法得出结论是否 100% 可能。

【问题讨论】:

【参考方案1】:

如果您使用 AVAudioSession,则可以使用“overrideOutputAudioPort:error:”方法来实现。这是 AVAudioSession 类参考的链接:https://developer.apple.com/library/IOs/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/index.html

【讨论】:

啊,我已经这样做了。选项是有限的,因为覆盖选项是 AVAudioSessionOverrideSpeaker 和 AVAudioSessionOverrideNone。来自 Apple docs for OverrideNone “使用此选项将音频路由到当前类别和模式的系统默认输出”。

以上是关于覆盖 iOS 音频输出的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 从后台程序访问输出音频

iOS HSP 关闭音频输出

如何在 iOS 中捕获音频输出?

使用单声道输入和立体声输出设置音频单元 iOS

音频会话“闪避”在 iOS 4 中中断...?

AEC ios 多音频单元图