MPMoviePlayerControllerでAirPlayを有効にすると、「このビデオはデバイス名で再生されています」というテキストが表示されます。AVPlayerでAirPlayを使用する場合、プログラムでデバイス名を取得する方法はありますか?
質問する
5608 次
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]];
(取得したいのはportType
of portDescription
of です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, ¤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;
}
于 2013-01-17T21:18:25.987 に答える