Получить имя устройства AirPlay с помощью AVPlayer

Когда AirPlay включен в MPMoviePlayerController, он отображает текст "Это видео воспроизводится наимя устройства ", При использовании AirPlay с AVPlayer, есть ли способ программно получить имя устройства?

 coco19 нояб. 2012 г., 16:47
Похоже, из звучащей тишины нет способа программно получить имя устройства?

Ответы на вопрос(4)

Решение Вопроса

чтобы получить название Apple TV, вы 'После подключения я наконец нашел эту информацию в рамках AudioToolbox. Могут быть и другие способы получить это, но пока я не нашел другого пути. Надеюсь это поможет.

Вы'Вам нужно будет импортировать каркас AudioToolbox:

#import <audiotoolbox audiotoolbox.h="">
</audiotoolbox>

а затем метод для вызова, когда вы хотите определить, доступна ли трансляция

- (BOOL)isAirplayActive {
  CFDictionaryRef currentRouteDescriptionDictionary = nil;
  UInt32 dataSize = sizeof(currentRouteDescriptionDictionary);
  AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &dataSize, ¤tRouteDescriptionDictionary);

  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;
}
 Anton Holmquist09 окт. 2013 г., 14:28
Оно работает! Большое спасибо :)
 Anton Holmquist20 янв. 2013 г., 21:16
Звучит многообещающе! Я попробую это и вернусь.
 Jason R. Escamilla13 сент. 2014 г., 06:27
в iOS 8 вам нужно изменить: if (CFArrayGetCount (выводы)> 0) to: if (выводит && CFArrayGetCount (выходные данные)> 0)

Вместо этого Apple сделала доступным API-интерфейс currentRoute в AudioSession, что позволяет получить его ».Информация о порте, а также приятное прослушивание audioRouteChangeNotification:

NSString* airplayName = [self activeAirplayOutputRouteName];
if (airplayName) {
    //airplay is active

}

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteHasChangedNotification:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];

(то, что вы хотите получить, этоportType изportDescription изaudioSession.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
}

Swift 4

    NotificationCenter.default.addObserver(
        self,
        selector: #selector(airplayChanged),
        name: AVAudioSession.routeChangeNotification,
        object: AVAudioSession.sharedInstance())
}

@objc func airplayChanged() {
    isAirPlaying = false
    let currentRoute = AVAudioSession.sharedInstance().currentRoute
    for output in currentRoute.outputs where output.portType == AVAudioSession.Port.airPlay {
        print("Airplay Device connected with name: \(output.portName)")
        isAirPlaying = true
    }
}

выложу аналогичный ответ, чемокружающий свет для быстрого Может быть, это будет полезно для кого-то в будущем.

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())
}
 SebastianView18 окт. 2016 г., 16:56
Этот работал отлично и просто, яя иду к вершине с вами
 TomCobo18 окт. 2016 г., 17:27
хаха, спасибо @SebastianView!

Ваш ответ на вопрос