检测连接的音频设备 iOS

Posted

技术标签:

【中文标题】检测连接的音频设备 iOS【英文标题】:Detect attached audio devices iOS 【发布时间】:2011-09-08 22:33:48 【问题描述】:

我正在尝试弄清楚如何检测 iphone/ipad/ipod 上是否连接了哪些音频设备。我知道所有关于音频路由调用和路由更改回调的信息,但这些并没有告诉我任何关于附加内容的信息。他们只报告音频当前路由的位置。例如,我需要知道在音频通过扬声器路由时是否仍连接耳机和/或蓝牙。或者,例如,如果用户在使用蓝牙时插入耳机然后决定断开蓝牙,我需要知道即使音频仍在通过耳机路由,蓝牙也已断开。

【问题讨论】:

我在我的应用程序中遇到了类似的问题,我的应用程序正在正确播放流,但是如果我更改音频输出(拔下耳机),它会停止播放..您是否知道如何检测音频输出何时更改? 是的,检测路由更改是通过 AudiosessionPropertyListener 回调完成的。然后通过 AudioSessionAddPropertyListener 函数注册属性监听器。然而,这不是我在上面想要做的。在我的应用程序中,我需要检测连接了哪些设备才能正确地向用户显示可用的路由选项。 【参考方案1】:

不幸的是,从 iOS11 开始,似乎没有 API 可以可靠地获取当前连接的输出设备列表 - 一旦当前路由发生变化,您只能通过 AVAudioSession 的 currentRoute.outputs 看到 1 个设备(当前路由) ,即使仍然可以连接多个设备。

但是,对于输入,包括具有 HFP 配置文件的蓝牙设备,如果使用正确的音频会话模式(例如 AVAudioSessionModeVoiceChatAVAudioSessionModeVideoChat),可以通过 AVAudioSession 的 @ 获取可用输入的列表987654324@,即使该设备不是活动路由,这些输入也会在此处列出 - 例如,当用户通过 MPVolumeView 从蓝牙到扬声器进行手动覆盖时,这非常有用,因为 HFP 是 2 -way IO(有输入和输出),可以通过查看输入来判断输出HFP蓝牙是否仍然可用。

BOOL isBtInputAvailable = NO;
NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs];
for (AVAudioSessionPortDescription* port in inputs) 
    if ([port.portType isEqualToString:AVAudioSessionPortBluetoothHFP]) 
        isBtInputAvailable = YES;
        break;
    

【讨论】:

这个有更新吗?郁闷的是我只能知道一台蓝牙设备的连接状态,而且我必须在.playAndRecord.record模式下才能这样做。【参考方案2】:

如果是 iOS 5,您应该使用:

CFStringRef newRoute;
size = sizeof(CFStringRef);
XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute), "couldn't get new audio route");
if (newRoute)

    CFShow(newRoute);
    if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), NULL) == kCFCompareEqualTo) // headset plugged in
          
            colorLevels[0] = .3;                
            colorLevels[5] = .5;
          
    else if (CFStringCompare(newRoute, CFSTR("SpeakerAndMicrophone"), NULL) == kCFCompareEqualTo)

【讨论】:

【参考方案3】:

您可以从 AudioSession 属性中获取 InputSources 和 OutputDestinations 的列表。 查看这些会话属性:

kAudioSessionProperty_InputSources
kAudioSessionProperty_OutputDestinations

并且要查询每个的详细信息,可以使用:

kAudioSessionProperty_InputSource
kAudioSessionProperty_OutputDestination

【讨论】:

这些属性适用于 USB 附件,因此不适用于我的情况。我希望检测何时连接了蓝牙或有线耳机。 糟糕,很抱歉,我现在看到你的问题有所不同了。

以上是关于检测连接的音频设备 iOS的主要内容,如果未能解决你的问题,请参考以下文章

如何检测音频是不是无法静音?

如何检测我的音频流 url 是不是无法被 iOS 设备播放 - swift3

检测新的视频和音频输入

iOS 7 多人连接流式音频

将音频流式传输到其他 iOS 设备(使用多点)并通过本地设备播放音频

列出设备iOS swift中的所有音频文件