iOS:Airplay选取器MPVolumeView的替代品

我正在使用MPVolumeView为avplayer播放播放selectairplay设备。 有没有可能的非私人API的替代品,所以我将能够提供我自己的用户界面控件挑选airplay设备?

我指的是API,我的意思是,我需要的是:

  1. 能够将audio重新路由到Airplay-设备特定的audio路由。
  2. 回收airplay设备名称。 (获取所有可用的audio路由,然后获取播放audio路由的描述)

我知道AudioToolbox框架提供了一些额外的API来处理AudioSession,但我发现重新路由audio的唯一方法是AVAudioSession的:

- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride error:(NSError **)outError` 

只允许将audio重新路由到内置扬声器。 也许还有一些其他的方法如何实现呢? (我也只是find了如何检索AirplayDevice的名称作为当前audio路由的描述 – 使用AVPlayer获取AirPlay设备的名称 )

所以我的问题的确切答案是:

(i)除了切换到内置扬声器之外,不可能使用公共API以编程方式切换audioRoutes。

 [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; 

(ii)如果您正在使用AudioRoute,则只能检索airplay设备的名称。 使用AVPlayer获取AirPlay设备的名称

因此,展示用于selectairplay的自定义UI控件的实际解决scheme将是:

要自定义MPVolumeView ,您可以在其中禁用volumeSlider并自定义routeButton 。 然而,当您点击routeButton ,您将无法在UIActionSheet中挑选与Apple兼容的无线设备(airPlay,蓝牙等)列表中的routeButton ,但是您可以通过订阅audioRouteChangeNotification :

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteHasChangedNotification:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]]; 

(另外请注意,如果您将插入/取出耳机,它也会触发此通知)

如果您有兴趣如何检索所有可用的audio路由,并使用私有API以编程方式切换

MPMediaPlayer框架包含一个私有类MPAVRoutingController ,它可以让你完全:

 Class MPAVRoutingController = NSClassFromString(@"MPAVRoutingController"); Class MPAVRoute = NSClassFromString(@"MPAVRoute"); id routingController = [[MPAVRoutingController alloc] init]; NSArray* availableRoutes = [routingController performSelector:@selector(availableRoutes)]; BOOL isSwitchSuccesful = [[routingController performSelector:@selector(pickRoute:) withObject:availableRoutes.lastObject] boolValue]; 

(如果你想然后访问audioRoute信息,并检查它是否是Airplay: 检测airplayRoute )