12

MPMoviePlayerControllerでAirPlayを有効にすると、「このビデオはデバイス名で再生されています」というテキストが表示されます。AVPlayerでAirPlayを使用する場合、プログラムでデバイス名を取得する方法はありますか?

4

4 に答える 4

10

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]];

(取得したいのはportTypeof portDescriptionof です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
}
于 2014-07-31T00:46:39.827 に答える
8

接続しているAppleTVの名前を取得するために他のフレームワークを検索した後、私はついにこの情報をAudioToolboxフレームワークで見つけました。これを取得する方法は他にもあるかもしれませんが、これまでのところ、別の方法は見つかりませんでした。お役に立てれば。

AudioToolboxフレームワークをインポートする必要があります。

#import <AudioToolbox/AudioToolbox.h>

次に、Airplayが利用可能かどうかを検出するときに呼び出すメソッド

- (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;
}
于 2013-01-17T21:18:25.987 に答える