iOS:Airplay选择器MPVolumeView替代品

amb*_*ght 4 audiotoolbox ios airplay

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

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

  1. 能够将音频重新路由到特定于airplay设备的audioRoute.
  2. 重温播放设备名称.(获取所有可用的audioRoutes,然后获取airplay audioRoutes的说明)

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

- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride  error:(NSError **)outError`
Run Code Online (Sandbox Code Playgroud)

只允许将音频重新路由到内置扬声器.也许还有其他方法如何在那里实现它?(我也只找到了如何检索AirplayDevice的名称作为currentAudioRoute的描述的方式 - 使用AVPlayer获取AirPlay设备的名称)

amb*_*ght 6

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

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

[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
Run Code Online (Sandbox Code Playgroud)

(ii)如果是有效的AudioRoute,您只能检索airplay-device的名称.使用AVPlayer获取AirPlay设备的名称

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

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

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteHasChangedNotification:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];
Run Code Online (Sandbox Code Playgroud)

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

如果您有兴趣检索所有可用的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];
Run Code Online (Sandbox Code Playgroud)

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