我正在使用MPVolumeView选择airplay设备进行avplayer airplay播放。 是否有任何可能的非私有API替代方案,因此我可以提供自己的UI控件来选择播放设备?
通过引用API,我的意思是,我只需要:
我知道AudioToolbox框架提供了一些额外的API来处理AudioSession,但我找到重新路由音频的唯一方法是AVAudioSession&#39>:
- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride error:(NSError **)outError`
仅允许将音频重新路由到内置扬声器。也许还有其他方法如何在那里实现它? (我也只找到了如何检索AirplayDevice的名称作为currentAudioRoute的描述的方式 - Get name of AirPlay device using AVPlayer)
答案 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)