AirPlayer 一網(wǎng)打盡

引言

為了視聽的效果,手機(jī)投屏播放,已經(jīng)成為各大視頻軟件必備的功能之一


原理

其原理就是 AirPlay協(xié)議

AirPlay 協(xié)議是蘋果公司實(shí)現(xiàn)的在蘋果產(chǎn)品之間傳輸媒體流信息的一組協(xié)議。蘋果公司產(chǎn)品之間可以使用該技術(shù)自動(dòng)地互相發(fā)現(xiàn),并且輕松地互相傳輸音樂、圖片及視頻文件。此外,AirPlay 還有一種鏡像(AirPlay Mirroring)功能,可以將 iPad 或者iPhone 的整個(gè)屏幕投放到更大屏幕的電視機(jī)上,實(shí)現(xiàn)“無線投屏”的效果。

AirPlay協(xié)議的基礎(chǔ)是組播 DNS(Multicast Domain Name Server,簡稱mDNS)協(xié)議和DNS服務(wù)發(fā)現(xiàn)(DNS Service Discovery,簡稱DNS-SD)協(xié)議,它們是 IETF Zeroconf 工作組(www.zeroconf.org)提出的用于自動(dòng)尋找設(shè)備及服務(wù)的網(wǎng)絡(luò)協(xié)議,蘋果公司以這兩個(gè)協(xié)議為基礎(chǔ),實(shí)現(xiàn)了蘋果公司數(shù)字家庭網(wǎng)絡(luò)框架。

AirPlay協(xié)議消息發(fā)送格式及規(guī)則基于 mDNS 協(xié)議(http://files.multicastdns.org/draft-cheshire-dnsext-multicastdns.txt),mDNS 協(xié)議基于組播技術(shù),定義了家庭各個(gè)設(shè)備之間的消息的基本格式和接收/發(fā)送規(guī)則。該協(xié)議以 DNS 協(xié)議為基礎(chǔ),并對其消息格式和消息收發(fā)順序作出了一些修改。例如對 DNS 消息包頭進(jìn)行了簡化,使其專注于實(shí)現(xiàn)家庭設(shè)備的互相發(fā)現(xiàn);另外,考慮到使用組播技術(shù),mDNS 在降低網(wǎng)絡(luò)擁塞和消息冗余方面也作出了很多改進(jìn),使得局域網(wǎng)內(nèi)設(shè)備和服務(wù)的發(fā)現(xiàn)不會(huì)引起過多的消息交互。

在 mDNS 協(xié)議的基礎(chǔ)上,DNS-SD 協(xié)議http://tools.ietf.org/html/draft-cheshire-dnsext-dns-sd-11)規(guī)定了一個(gè)服務(wù)宣告及使用的完整過程。即設(shè)備必須發(fā)送什么樣的 mDNS 消息才能完整地宣告并描述自己服務(wù)。DNS-SD 協(xié)議使用 PTR、SRV和TXT 三種類型的記錄全面描述了一個(gè)服務(wù)的類型,名稱以及所在主機(jī)的 IP 和端口號(hào)等。

當(dāng)使用 DNS-SD 協(xié)議 實(shí)現(xiàn)了對設(shè)備及服務(wù)的發(fā)現(xiàn)和描述后,蘋果公司的 AirPlay 協(xié)議 規(guī)定了圖片、音頻及視頻的傳輸和控制消息格式,從而實(shí)現(xiàn)了智能設(shè)備之間的媒體共享和協(xié)同動(dòng)作。例如,在通過 DNS-SD 獲得了其他設(shè)備及服務(wù)的信息(即設(shè)備或服務(wù)的IP地址及端口號(hào))之后,AirPlay使用HTTP消息實(shí)現(xiàn)了圖片和視頻的傳輸及控制,使用 RSTP 協(xié)議實(shí)現(xiàn)了音頻的傳輸和控制。

簡單點(diǎn)說就是:

在局域網(wǎng)內(nèi),通過 UDP 組播, 發(fā)現(xiàn)設(shè)備 ;然后通過 TCP 進(jìn)行握手,建立 TCP 鏈接 ,開始通訊。

注意
airPlay 推送的不是 播放的 URL , 推送的是 手機(jī)設(shè)備解析后的視頻流和音頻流,也就是說,在 airPlay 推送過程中, AppleTV 并不是自己去下載視頻的,而是接收 手機(jī) 發(fā)送過來的 信息。這也是為什么,當(dāng)承載 airPlay 的 對象銷毀后,airPlay 就會(huì)停止的原因。


具體實(shí)現(xiàn)

在iOS 聲音可以分為倆大類,App soundSystem sound,System sound 做為按鍵回饋或是警示聲使用,剩下的就是App sound。在 MPVolumeView 選擇了Airplay 后,系統(tǒng)會(huì)自動(dòng)把 App sound 切換到支援 Airplay 的裝置上。
基于這個(gè),就可以對 airPlay 和 phone 的切換進(jìn)行監(jiān)聽。
在iOS7,MPVolumeView 新增了兩個(gè) property

//如果需要包含內(nèi)建的音量控制元件
MPVolumeView *volumeView = [ [MPVolumeView alloc] init] ;
[view addSubview:volumeView];
// 如果不需要
MPVolumeView *volumeView = [ [MPVolumeView alloc] init] ;
[volumeView setShowsVolumeSlider:NO];
[volumeView sizeToFit];
[view addSubview:volumeView];

iOS7 后MPVolumeView 增加
@property areWirelessRoutesAvailable;
@property isWirelessRouteActive; 
 
//可以偵測到有airplay以及使用者改變了airplay route
NSString *const MPVolumeViewWirelessRoutesAvailableDidChangeNotification;
NSString *const MPVolumeViewWirelessRouteActiveDidChangeNotification; 

// 通知
MPVolumeViewWirelessRoutesAvailableDidChangeNotification
//airplay是否在通訊:
UIScreenDidConnectNotification and UIScreenDidDisconnectNotification 

利用 MPMoviePlayerController 打開 airPlay

// MPMoviePlayerController 打開或者關(guān)閉 airPlay ,只需要設(shè)置下面的屬性
// Indicates whether the movie player allows AirPlay video playback. Defaults to YES on iOS 5.0 and later.
@property (nonatomic) BOOL allowsAirPlay MP_API_IOS_DEPRECATED_WITH_REPLACEMENT_MACOS_TVOS_PROHIBITED("Use AVPlayerViewController in AVKit.", 4.3, 9.0, 10.12.2, 10.12.2, 4.3, 9.0)
;

可以看出,apple 對 airPlay 的封裝是非常好的, 開發(fā)者只需要對幾個(gè)通知進(jìn)行觀察,就能監(jiān)聽整個(gè) airPlay 的生命周期。

注意
在具體實(shí)現(xiàn)中,要實(shí)現(xiàn)當(dāng) APP 進(jìn)入后臺(tái)后, airPlay 還正常播放,需要在 plist 設(shè)置 background mode 添加 App plays audio or streams audio/video using AirPlay。
另外由于,對整個(gè) APP 來說,全局只有一個(gè) airPlay ,所以最好用 單例 的方式實(shí)現(xiàn)。


結(jié)束語

airPlay 實(shí)現(xiàn)是比較簡單的,但如何在具體 APP 中 ,比如說 ,碼率切換 中 ,如何實(shí)現(xiàn)更好的體驗(yàn) ,這是需要雕琢的。不過總的來說,實(shí)現(xiàn)并不難,因?yàn)檫@塊蘋果封裝的確實(shí)很好。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容