iOS:Airplay选择器MPVolumeView替代品

时间:2014-04-11 08:36:32

标签: ios airplay audiotoolbox

我正在使用MPVolumeView选择airplay设备进行avplayer airplay播放。 是否有任何可能的非私有API替代方案,因此我可以提供自己的UI控件来选择播放设备?

通过引用API,我的意思是,我只需要:

  1. 能够将音频重新路由到特定于airplay设备的audioRoute。
  2. 重温播放设备名称。 (获取所有可用的audioRoutes,然后获取airplay audioRoutes的说明)
  3. 我知道AudioToolbox框架提供了一些额外的API来处理AudioSession,但我找到重新路由音频的唯一方法是AVAudioSession&#39>:

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

(ii)如果是有效的AudioRoute,您只能检索airplay-device的名称。 Get name of AirPlay device using AVPlayer

因此,实用解决方案为选择播放提供自定义UI控件将是:

要自定义MPVolumeView,您可以在其中停用volumeSlider并自定义routeButton。但是,当您点击UIActionSheet时弹出窗口中的routeButton中的苹果兼容无线设备(airPlay,蓝牙等)列表中选择airplayDevice时,您没有其他选择,但您可以观察用户何时会通过订阅audioRouteChangeNotification进行选择:

[[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