iOS:Airplay 选择器 MPVolumeView 替代品

标签 ios airplay audiotoolbox

我正在使用 MPVolumeView 为 avplayer airplay 播放选择 airplay 设备。 是否有任何可能的非私有(private) API 替代方案来执行此操作,以便我能够提供自己的 UI 控件来选择 airplay 设备?

通过引用 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)

最佳答案

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

(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/

相关文章:

ios - swift 在 UIDocumentPicker 中设置文档扩展名

ios - 我应该如何处理 Siesta 中的部分 EntityCache 命中?

ios - Chromecast 按钮未隐藏

ios - 检测 AirPlay 延迟

ios - AirPlay iOS 接收器/录音机

iphone - 无法动态生成 UITextField 代替 UILabel?

ios - 如何在不使用 iOS7 弃用方法的情况下获取 AirPlay 设备名称

ios - AVFoundation 不播放声音

audio - 混合音频 channel 背后的基本数学

ios - EZAudio 自定义 AudioStreamBasicDescription 没有按我的预期工作