我正在使用 MPVolumeView 为 avplayer airplay 播放选择 airplay 设备。 是否有任何可能的非私有(private) API 替代方案来执行此操作,以便我能够提供自己的 UI 控件来选择 airplay 设备?
通过引用 API,我的意思是,我需要的是:
- 能够将音频重新路由到特定于 airplay 设备的 audioRoute。
- 检索 airplay 设备名称。 (获取所有可用的 audioRoutes,然后获取 airplay audioRoutes 的描述)
我知道 AudioToolbox 框架提供了一些额外的 API 来处理 AudioSession,但我发现重新路由音频的唯一方法是 AVAudioSession 的:
- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride error:(NSError **)outError`
它只允许将音频重新路由到内置扬声器。也许还有其他方法可以在那里实现它? (我也只找到了如何检索 AirplayDevice 的名称作为 currentAudioRoute 的描述的方法 - Get name of AirPlay device using AVPlayer)
最佳答案
所以我的问题的准确答案是:
(i) 除了切换到内置扬声器外,无法使用公共(public) API 以编程方式切换 audioRoutes。
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
(ii) 如果 airplay-device 是事件的 AudioRoute,您只能检索它的名称。 Get name of AirPlay device using AVPlayer
因此,呈现用于选择播放播放的自定义 UI 控件的实用解决方案是:
自定义MPVolumeView
,可以禁用volumeSlider
,自定义routeButton
。但是,您别无选择,只能在点击 routeButton
时弹出的 UIActionSheet
中的苹果兼容无线设备(airPlay、蓝牙等)列表中选择 airplayDevice,但是您可以通过订阅 audioRouteChangeNotification 来观察用户何时会在那里进行选择:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteHasChangedNotification:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];
(另请注意,如果您将插入/拔出耳机,它也会触发此通知)
如果您对如何使用私有(private) API 以编程方式检索所有可用的 audioRoutes 和切换感兴趣:
MPMediaPlayer
框架包含一个私有(private)类 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)
关于iOS:Airplay 选择器 MPVolumeView 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23007498/