2014-04-11 47 views
4

我使用MPVolumeView为avplayer播放器播放选择airplay设备。 是否有任何可能的非私有API替代品,因此我可以提供自己的UI控件来选择airplay设备?iOS:Airplay选择器MPVolumeView替代

通过参照API,我的意思是,我需要的是:

  1. 能够重新路由音频AirPlay的设备特定audioRoute。
  2. 回收airplay-设备名称。 (获得所有可用audioRoutes,然后得到的AirPlay audioRoutes描述)

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

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

它只允许将音频重新路由到内置扬声器。也许还有其他的方法如何实现它呢? (我也没有只找到办法如何检索AirplayDevice的名称作为currentAudioRoute的描述 - Get name of AirPlay device using AVPlayer

回答

6

所以准确回答我的问题:

(I)它无法切换音频使用公共API以编程方式传输,除了切换到内置扬声器。

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

(II)你可以,如果是主动AudioRoute只检索AirPlay的设备的名称。 Get name of AirPlay device using AVPlayer

所以实用的解决方案来呈现定制UI控件,以便选择点播将是:

要定制MPVolumeView,在那里你可以禁用volumeSlider和定制routeButton。然而,当您点击routeButton时弹出窗口,但您可以观察用户何时将通过订阅audioRouteChangeNotification进行选择,您没有其他选择在UIActionSheet中选择与Apple兼容的无线设备(airPlay,蓝牙等)列表中的airplayDevice选项:

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

(也请注意,如果您将插入/拔出耳机,它也将触发此通知),如果你有兴趣如何检索所有可用audioRoutes与私有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:Detecting airplayRoute

+0

我的[类似的问题](HTTP://计算器。com/questions/31864398/ios-airplay-action-sheet-for-public-app-store-publishing-like-in-spotify),并想知道如果不使用私有API,即使没有定制的常规操作表也是可能的? –

+0

我不知道他们是否添加了任何新的API,但似乎我们无法直接使用他们的ActionSheet(现在称为AlertController)。你可以尝试使用它 - 比如尝试访问它的视图子视图,并尝试sendActionsForControlEvents,看看你是否可以通过编程方式假冒用户触摸,如果你可以,那么你可能可能会在没有私有API的情况下以编程方式切换路由 – ambientlight