使用AVPlayer获取AirPlay设备的名称

当在MPMoviePlayerController中启用AirPlay时,它将显示一个文本“此video正在播放设备名称 ”。 在AVPlayer上使用AirPlay时,有没有办法以编程方式获取设备名称?

在其他框架中search以获取您连接的Apple TV的名称后,我终于在AudioToolbox框架中find了这些信息。 可能还有其他的方法来获得这个,但到目前为止我还没有find另一种方式。 希望这可以帮助。

您需要导入AudioToolbox框架:

#import <AudioToolbox/AudioToolbox.h> 

然后当您想要检测播放是否可用时调用一个方法

 - (BOOL)isAirplayActive { CFDictionaryRef currentRouteDescriptionDictionary = nil; UInt32 dataSize = sizeof(currentRouteDescriptionDictionary); AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &dataSize, &currentRouteDescriptionDictionary); self.deviceOutputType = nil; self.airplayDeviceName = nil; if (currentRouteDescriptionDictionary) { CFArrayRef outputs = CFDictionaryGetValue(currentRouteDescriptionDictionary, kAudioSession_AudioRouteKey_Outputs); if(CFArrayGetCount(outputs) > 0) { CFDictionaryRef currentOutput = CFArrayGetValueAtIndex(outputs, 0); //Get the output type (will show airplay / hdmi etc CFStringRef outputType = CFDictionaryGetValue(currentOutput, kAudioSession_AudioRouteKey_Type); //If you're using Apple TV as your ouput - this will get the name of it (Apple TV Kitchen) etc CFStringRef outputName = CFDictionaryGetValue(currentOutput, @"RouteDetailedDescription_Name"); self.deviceOutputType = (NSString *)outputType; self.airplayDeviceName = (NSString *)outputName; return (CFStringCompare(outputType, kAudioSessionOutputRoute_AirPlay, 0) == kCFCompareEqualTo); } } return NO; } 

从iOS7开始,currentRoute的AudioToolbox API已被弃用:

Apple改为在AudioSession中为你提供currentRoute API,它可以检索它的端口信息,并以一种很好的方式监听audioRouteChangeNotification:

 NSString* airplayName = [self activeAirplayOutputRouteName]; if (airplayName) { //airplay is active } [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteHasChangedNotification:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]]; 

(你想得到的是portDescriptionportTypeaudioSession.currentRoute ):

 - (NSString*)activeAirplayOutputRouteName { AVAudioSession* audioSession = [AVAudioSession sharedInstance]; AVAudioSessionRouteDescription* currentRoute = audioSession.currentRoute; for (AVAudioSessionPortDescription* outputPort in currentRoute.outputs){ if ([outputPort.portType isEqualToString:AVAudioSessionPortAirPlay]) return outputPort.portName; } return nil; } - (void)audioRouteHasChangedNotification:(NSNotification*)notification { //do something } 

我会发布一个类似的答案比环境光快速。 也许这对未来的人是有帮助的。

 private func addAirplayNotifier() { NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("airplayChanged:"), name: AVAudioSessionRouteChangeNotification, object: AVAudioSession.sharedInstance()) } func airplayChanged(sender:NSNotification) -> Bool { var airplayConnected = false let currentRoute = AVAudioSession.sharedInstance().currentRoute for output in currentRoute.outputs { if output.portType == AVAudioSessionPortAirPlay { print("Airplay Device connected with name: \(output.portName)") airplayConnected = true } } print("Disconnect Airplay") return airplayConnected } 

Swift 3.0

 private func addAirplayNotifier() { NotificationCenter.default.addObserver(self, selector: Selector("airplayChanged:"), name:NSNotification.Name.AVAudioSessionRouteChange, object: AVAudioSession.sharedInstance()) }