AirPlay使用詳解
先上Demo地址 https://github.com/HeYming/AirPlayer
之前項(xiàng)目中,老大要求需要支持隔空,特地研究下這個(gè)是如何使用。

MPVolumeView
MPVolumeView是MediaPlayer框架里面的一個(gè)組件,調(diào)節(jié)音量使用的控件。但是他在iOS 9.0之前,還可以用來支持AirPlay功能。
_View_airplay = [[MPVolumeView alloc] initWithFrame:CGRectMake(20, 350, 30, 30)];
_View_airplay.showsVolumeSlider = NO;
[self.view addSubview:_View_airplay];
他的用法很簡單,創(chuàng)建一個(gè)View,設(shè)置大小位置,放到View上就可以了。
但是這個(gè)方法在iOS9.0之后就取消了。且在無AirPlay設(shè)備的時(shí)候是不會顯示的。
當(dāng)有AirPlay設(shè)備后,他就會顯示出來。注意他是個(gè)白色icon,背景色為白色的時(shí)候可能會看不見。
AVRoutePickerView
那么在iOS9之后MPVolumeView不再更新了就沒有新的AirPlay組件了嗎?
當(dāng)然不會,蘋果在iOS11的時(shí)候,在AVKit框架中加入了AVRoutePickerView組件,用來代替原來的MPVolumeView。
AVRoutePickerView * view = [[AVRoutePickerView alloc]initWithFrame:CGRectMake(100, 350, 30, 30)];
//活躍狀態(tài)顏色
view.activeTintColor = [UIColor redColor];
//設(shè)置代理
view.delegate = self;
[self.view addSubview:view];
基本上看起來跟MPVolumeView沒有什么區(qū)別,但是AVRoutePickerView的默認(rèn)icon改了,注意區(qū)分。
AVRoutePickerView也新增了兩個(gè)代理:
//AirPlay界面彈出時(shí)回調(diào)
- (void)routePickerViewWillBeginPresentingRoutes:(AVRoutePickerView *)routePickerView API_AVAILABLE(ios(11.0)){
_lab.text = @"AirPlay界面彈出時(shí)回調(diào)";
}
//AirPlay界面結(jié)束時(shí)回調(diào)
- (void)routePickerViewDidEndPresentingRoutes:(AVRoutePickerView *)routePickerView API_AVAILABLE(ios(11.0)){
_lab.text = @"AirPlay界面結(jié)束時(shí)回調(diào)";
}
這兩個(gè)代理是在彈出選擇設(shè)備界面的時(shí)候調(diào)用的,可以把暫停開始功能加入到這個(gè)代理方法里面增加用戶體驗(yàn)。
需要注意的是,AVRoutePickerView在周邊沒有AirPlay設(shè)備的時(shí)候也會顯示icon。
手動管理
這個(gè)就直接看DEMO吧,這部分代碼來源于https://github.com/coderMYC/Airplay這位大佬的項(xiàng)目。
這部分可以在無音視頻的情況下連接到AirPlay設(shè)備,在將播放連接丟給AirPlay設(shè)備。親測可以后臺播放,但是附近無AirPlay設(shè)備的時(shí)候,也是無法查找到設(shè)備的。
其他事項(xiàng)
AirPlay可以在當(dāng)前界面沒有音視頻的時(shí)候創(chuàng)建,當(dāng)連接到AirPlay設(shè)備后,音視頻播放會直接在AirPlay設(shè)備上播放而不在當(dāng)前設(shè)備上播放,這點(diǎn)需要注意。
AirPlay功能實(shí)現(xiàn)很簡單,但是存在換代的問題,iOS11之前用的MPVolumeView所在的框架播放器,功能簡陋且原生不支持進(jìn)度條拖動。
iOS11之后的AVKit框架中AVPlayerViewController播放器則功能更豐富一些,如果不需要深度定制,建議大家使用AVPlayerViewController播放器來播放視頻。
當(dāng)然,AVPlayer也不是萬能的,他無法播放flv格式的視頻。當(dāng)AVPlayer也無法滿足需求的時(shí)候,這個(gè)時(shí)候萬能播放解碼器FFmpeg來了。知名視頻播放框架ijkplayer就采用了MediaPlayer、AVPlayer和FFmpeg三種解碼模式。但是在FFmpeg模式下,AirPlay設(shè)備只能播放音頻,不能播放視頻,目前還無解決方案,有哪位大神有方案請告知。