相信很部分人有點懵阳柔,網上帖子很多關于AirPlay焰枢,看完后還是有點不明白,怎么支持調試使用AirPlay來成功投屏舌剂!
通俗易懂直接上
首先AirPlay需要引入<MediaPlayer/MediaPlayer.h>
self.volumView = [[MPVolumeView alloc] initWithFrame:view.bounds];
[self.volumView setRouteButtonImage:[UIImage imageNamed:showForScreenImg] forState:UIControlStateNormal];
self.volumView.showsVolumeSlider = NO;
[viewaddSubview:self.volumView];
前提有AirPlay設備可用济锄,點擊MPVolumeView彈出列表,選中可用設備架诞,此時AirPlay已經連接成功拟淮。
如何將音頻干茉、視頻顯示連接設備上
NSURL *mediaUrl = [NSURL URLWithString:airPlayUrl];
//為即將播放的視頻內容進行建模
self.item = [[AVPlayerItem alloc] initWithURL:mediaUrl];
//給播放器賦值要播放的對象模型
self.myPlayer = [AVPlayer playerWithPlayerItem:self.item];
self.myPlayer.allowsExternalPlayback = YES;
//指定顯示的Layer
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.myPlayer];
self.playerLayer.frame = self.bounds;
[self.layer addSublayer:self.playerLayer];
通過AVplay播放需要投屏的音視頻即可谴忧。
根據各App業(yè)務邏輯,正常實現快進快退角虫、暫停開始即可控制電視端投屏內容沾谓。
如何知道AirPlay的連接和斷開狀態(tài)?
注冊AVAudioSessionRouteChangeNotification通知戳鹅,該通知在音頻通道發(fā)生變化時會進行調用(例如插入/拔出耳機 揚聲器/聽筒切換 連接/斷開AirPlay設備).這個的通知是唯一且不重復的.在發(fā)生改變時[AVAudioSession sharedInstance]會發(fā)送此通知.在具體通知中通過獲取當前的AirPlay通道名稱來判斷是否連接到了投屏設備
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteHasChangedNotification:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];
/**
AVAudioSessionRouteChangeReasonKey = 1;
AVAudioSessionRouteChangeReasonKey = 2;
AVAudioSessionRouteChangeReasonKey = 4;
**/
- (void)audioRouteHasChangedNotification:(NSNotification *)notification{
self.airplayDeviceName = [self airplayOutputRouteName];
BOOL isAirPlay = self.airplayDeviceName.length > 0;
dispatch_async(dispatch_get_main_queue(), ^{
if ([self.airPlayDelegate respondsToSelector:@selector(selectTvEquipmentStartAirPlay:)]) {
[self.airPlayDelegate selectTvEquipmentStartAirPlay:self.airplayDeviceName];
}
});
}
//遍歷當前設備所有通道.返回isEqualToString:AVAudioSessionPortAirPlay通道的具體名稱,如果名稱不為nil則為當前連接到了AirPlay
- (NSString*)airplayOutputRouteName
{
AVAudioSession* audioSession = [AVAudioSession sharedInstance];
AVAudioSessionRouteDescription* currentRoute = audioSession.currentRoute;
for (AVAudioSessionPortDescription* outputPort in currentRoute.outputs){
if ([outputPort.portType isEqualToString:AVAudioSessionPortAirPlay])
return outputPort.portName;
}
return nil;
}
下次說:
AirPlay連接過程中多個場景音視頻均驶,禁止播放某音視頻。
如何區(qū)分AirPlay與系統鏡像投屏枫虏。