1、課程簡介
本課程主要講解,如何在iOS系統(tǒng)的設(shè)備上實現(xiàn),錄制屏幕的方案。主要使用iOS系統(tǒng)的Airplay功能和ReplayKit庫實現(xiàn)屏幕錄制。
2.課程目標(biāo)
1)了解如何使用Airplay實現(xiàn)屏幕錄制
2)了解如何使用ReplayKit實現(xiàn)屏幕錄制
3、課程目錄
1)Airplay Screen Mirroring
2)ReplayKit Capture Screen
4、課程內(nèi)容
4.1 Airplay Screen Mirroring
4.1.1 框架圖
框架圖
App 自帶Airplay service 功能,設(shè)備在自己上發(fā)布Airplay服務(wù),通過控制中心選擇服務(wù)節(jié)點,系統(tǒng)Airplay進程響應(yīng),并開始錄制視頻數(shù)據(jù),發(fā)送數(shù)據(jù)給Airplay service,App接收到數(shù)據(jù),發(fā)送到公網(wǎng)。
4.1.2 AirPlay?
百度搜索結(jié)果
WIKI英文搜索結(jié)果
通過以上結(jié)果,可以發(fā)現(xiàn)還是英文資料比較準(zhǔn)確,偏向于技術(shù)解釋:
AirPlay是Apple Inc.開發(fā)的一個專有協(xié)議棧/套件,允許音頻、視頻、設(shè)備屏幕和照片設(shè)備之間的無線流,以及相關(guān)的元數(shù)據(jù)。
Airplay協(xié)議詳解
協(xié)議集
4.1.3 Bonjour?
在過去二十年中,計算機逐漸從特定于平臺的協(xié)議(如AppleTalk,IPX和NetBIOS)轉(zhuǎn)向Internet協(xié)議(IP)。大多數(shù)計算機和其他網(wǎng)絡(luò)設(shè)備都使用TCP / IP進行通信。然而,在這種轉(zhuǎn)變中,丟失了一項功能 - 能夠?qū)⒃O(shè)備添加到本地網(wǎng)絡(luò),然后從網(wǎng)絡(luò)上的計算機和其他設(shè)備連接到這些設(shè)備,所有這些都很少或沒有配置。
要使IP工作,每個設(shè)備都需要一個唯一的地址,無論是靜態(tài)分配還是由DHCP服務(wù)器動態(tài)分配。動態(tài)分配的地址可以更改,因此,如果沒有Bonjour,必須使用靜態(tài)地址手動配置打印機和其他設(shè)備,以便網(wǎng)絡(luò)上的計算機可以訪問它們。然后,網(wǎng)絡(luò)管理員必須配置DNS服務(wù)器,以便計算機用戶不必通過IP地址連接到打印機。因此,看似微不足道的任務(wù)需要重要的配置。因為不適合網(wǎng)絡(luò)管理員的傳統(tǒng)角色的人經(jīng)常建立通過共享路由器將他們的筆記本電腦連接到互聯(lián)網(wǎng)的網(wǎng)絡(luò)系列,例如,這種配置水平是不切實際的。
甚至在IT專業(yè)人員運營的托管網(wǎng)絡(luò)中,要求對打印機等設(shè)備進行手動配置也沒有意義。人們期望能夠插入打印機,將兩臺筆記本電腦連接在一起,或者在本地網(wǎng)絡(luò)上查找文件服務(wù)器或游戲服務(wù)器,而不必浪費時間嘗試正確配置。
為了支持這一點,人們需要一種簡單可靠的方法來配置和瀏覽IP網(wǎng)絡(luò)上的服務(wù)。他們希望發(fā)現(xiàn)可用的服務(wù)并從列表中選擇一個,而不必提前知道每個服務(wù)的名稱或IP地址。具備此功能的IP符合每個人的利益。這正是Bonjour提供的功能。
Bonjour是Apple關(guān)于IP零配置網(wǎng)絡(luò)的提議。 Bonjour來自ZEROCONF工作組的工作,ZEROCONF工作組是互聯(lián)網(wǎng)工程任務(wù)組(IETF)的一部分。 ZEROCONF工作組的要求和基于IP的零配置網(wǎng)絡(luò)的建 議解決方案基本上涵蓋三個方面:
尋址(為主機分配IP地址)
命名(使用名稱來引用主機而不是IP地址)
服務(wù)發(fā)現(xiàn)(自動在網(wǎng)絡(luò)上查找服務(wù))
Bonjour針對所有這三個領(lǐng)域提供零配置解決方案,如以下四個部分所述。
Bonjour允許服務(wù)提供商,硬件制造商和應(yīng)用程序員支持單一網(wǎng)絡(luò)協(xié)議-IP,同時在易用性方面開辟了新天地。
網(wǎng)絡(luò)用戶不再需要分配IP地址,分配主機名,甚至不必輸入名稱來訪問網(wǎng)絡(luò)上的服務(wù)。用戶只需要查看可用的網(wǎng)絡(luò)服務(wù),并從列表中進行選擇。
在許多方面,這種瀏覽對應(yīng)用程序而言比用戶更強大。應(yīng)用程序可以自動檢測他們需要的服務(wù)或他們可以與之交互的其他應(yīng)用程序,允許自動連接,通信和數(shù)據(jù)交換,而無需用戶干預(yù)。
服務(wù)發(fā)布
服務(wù)發(fā)現(xiàn)
服務(wù)地址解析
Bonjour使用了幾種機制來減少零配置開銷,包括緩存、抑制重復(fù)響應(yīng)、指數(shù)退避和服務(wù)公告,如以下部分所述。
Bonjour使用多播DNS記錄的緩存來防止主機請求已經(jīng)請求的信息。例如,當(dāng)一個主機請求一個LPR打印后臺處理程序列表時,打印機列表通過多播返回,因此所有本地主機都能看到它。下次主機需要打印后臺處理程序列表時,它的緩存中已存在該列表,不需要重新發(fā)出查詢。多播DNS響應(yīng)程序負責(zé)維護緩存;應(yīng)用程序開發(fā)人員不需要做任何事情來維護緩存。 為了防止對同一查詢的重復(fù)回答,Bonjour服務(wù)查詢包括已知答案的列表。例如,如果主機正在瀏覽打印機,則第一個查詢不包含打印服務(wù),例如,從可用的打印服務(wù)器獲得12個答復(fù)。下次主機查詢打印服務(wù)時,該查詢包含已知服務(wù)器的列表。列表中已存在的打印服務(wù)器沒有響應(yīng)。
Bonjour以另一種方式抑制重復(fù)的響應(yīng)。如果一個主機即將響應(yīng),并且注意到另一個主機已經(jīng)用相同的信息響應(yīng),那么該主機將抑制其響應(yīng)。 應(yīng)用程序開發(fā)人員不需要采取任何措施來抑制重復(fù)的響應(yīng)。Bonjour處理重復(fù)的響應(yīng)抑制。
當(dāng)主機在瀏覽服務(wù)時,它不會連續(xù)發(fā)送查詢來查看是否有新的服務(wù)可用。相反,主機發(fā)出一個初始查詢并以指數(shù)形式較少地發(fā)送后續(xù)查詢,例如:1秒、3秒、9秒、27秒等之后,最長間隔為一小時。 這并不意味著瀏覽器要花一個多小時才能看到新的服務(wù)。當(dāng)一個服務(wù)在網(wǎng)絡(luò)上啟動時,它會使用類似的指數(shù)退避算法宣布它的存在幾次。通過這種方式,服務(wù)發(fā)布和發(fā)現(xiàn)的網(wǎng)絡(luò)流量保持在最低水平,但是新的服務(wù)很快就會出現(xiàn)。 在裝備Bonjour的主機上運行的服務(wù)在向MDNSResponder守護進程注冊時自動宣布。在其他硬件(如打印機)上運行的服務(wù)應(yīng)該實現(xiàn)服務(wù)通告,并采用指數(shù)后退來充分利用Bonjour。

4.1.4 如何本地創(chuàng)建遠程服務(wù)結(jié)點?
Bonjour服務(wù)一般用于發(fā)布服務(wù)全局廣播,但如果服務(wù)不想被其它機器知道,只有制定機器知道,如何實現(xiàn):
1、客戶端與服務(wù)器通信,等到服務(wù)器的服務(wù)ip地址,端口號
2、客戶端本地創(chuàng)建服務(wù)結(jié)點,并連接
問題關(guān)鍵:客戶端可不可以創(chuàng)建本地服務(wù)節(jié)點:
iOS API
由于bonjour服務(wù)是開源的,且iOS系統(tǒng)提供底層API庫:DNS-SD,去實現(xiàn)此功能。
4.2 ReplayKit Capture Screen
4.2.1 框架圖
框架圖
App通過擴展與系統(tǒng)錄屏進程連接,APP通過進程通訊與擴展協(xié)同,擴展把數(shù)據(jù)流傳到公網(wǎng)。
4.2.2 ReplayKit?

iOS9已經(jīng)實現(xiàn)了基本的app內(nèi)容錄制、預(yù)覽、保存、分享,但是其輸出的結(jié)果其實是一個已經(jīng)將音頻、視頻編碼并交織到一起成為一個mp4文件,開發(fā)者只能處理這個mp4文件,無法對原始音視頻數(shù)據(jù)進行處理。對于有些app可能存在諸如分辨率減小、碼率減小、音頻編輯等各種需求,都需要對原始的yuv、pcm數(shù)據(jù)進行處理,或者對編碼過程進行定制化干預(yù)。
ios10的replaykit的錄制已經(jīng)跟iOS9差異很大,ios10已經(jīng)支持錄制的原始音視頻數(shù)據(jù)的 【實時】獲?。╥OS9只可以獲取到錄制停止后編碼的mp4),開發(fā)者可以自己進行實時分發(fā)或者編碼后處理。 iOS10只支持app內(nèi)容錄制,所以當(dāng)app切到后臺,錄制內(nèi)容將停止。
到了iOS11時代,蘋果終于開放了對錄制內(nèi)容的升級,從iOS10的app內(nèi)升級到整個系統(tǒng)級別的錄制
iOS11的復(fù)雜操作啟動屏幕錄制,不知道阻塞了多少用戶的繼續(xù)使用。進入到2018年的iOS12,蘋果終于想通了,replaykit也迎來了柳暗花明,開發(fā)者企盼的api控制啟動錄制終于來了!iOS12還是會考慮用戶的感知性,要求開發(fā)者必須通過replaykit提供的 RPSystemBroadcastPickerView 來展示啟動的view,然后通過點擊view上面的按鈕才能啟動:
4.2.3 代碼示例


4.2.4 問題&展示
ReplayKit2屏幕錄制在iOS11新推出功能,比較少官方文檔并且存在著一些問題每個版本的系統(tǒng)都在不斷修復(fù)完善中。以下是一些使用中的常見現(xiàn)象或問題:
1.系統(tǒng)有聲音在播放但觀眾端無法聽到聲音
系統(tǒng)在做屏幕音頻采集時,在從home界面切到有聲音播放的App時才會采集聲音,從有聲音播放的App切換到無聲音播放的App時,即使原App還在播放聲音系統(tǒng)也不會進行音頻采集,此時需要從home界面重新進入到有聲音播放的App時系統(tǒng)才會重新采集。
2.收到推送信息觀眾端有時聽不到聲音
這個是ReplayKit2在早期系統(tǒng)中存在的問題,收到推送消息后會停止屏幕錄制的聲音采集或采集到的是靜音數(shù)據(jù),需要重新從home界面切回到有時間的App才能恢復(fù)音頻采集。在11.3之后的版本系統(tǒng)修復(fù)了這個問題。
3.打開麥克風(fēng)錄制時系統(tǒng)播放聲音會變小
這個是屬于系統(tǒng)機制:打開麥克風(fēng)采集時系統(tǒng)音頻處于錄制模式,會自動將其它的App播放的聲音變?yōu)槁犕材J?,中途關(guān)閉麥克風(fēng)采集也不會恢復(fù),只有關(guān)閉或重新啟動無麥克風(fēng)錄制時才會恢復(fù)為揚聲器的播放。這個機制不影響App那路聲音的錄制,即觀眾端聲音聽到的聲音大小不受影響。
4.屏幕錄制何時自動會停止
系統(tǒng)在鎖屏或有電話打入時,會自動停止屏幕錄制,此時SampleHandler里的broadcastFinished函數(shù)會被調(diào)用,可在此函數(shù)發(fā)通知提示用戶。
5.采集推流過程中有時屏幕錄制會自動停止問題
通常是因為設(shè)置的推流分辨率過高時在做橫豎屏切換過程中容易出現(xiàn)。ReplayKit2的直播擴展目前是有50M的內(nèi)存使用限制,超過此限制系統(tǒng)會直接殺死擴展進程,因此ReplayKit2上建議推流分辨率不高于720P。另外不建議使用autoSampleBufferSize時做橫豎屏切換,因為Plus的手機的分辨率可達1080*1920,容易觸發(fā)系統(tǒng)內(nèi)存限制而被強制停止,不要長時間引用
6.iphoneX手機的兼容性與畫面變形問題
iphoneX手機因為有劉海,屏幕采集的畫面分辨率不是9:16,如果設(shè)了推流輸出分辨率為9:16的比例如高清里是為960*540的分辨率,這時因為源分辨率不是9:16的,推出去的畫面就會稍有變形。建議設(shè)置分辨率時根據(jù)屏幕分辨率比例來設(shè)置,拉流端用AspectFit顯示模式iPhoneX的屏幕采集推流會有黑邊是正?,F(xiàn)象,AspectFill看畫面會不全。
5、總結(jié)
1、ReplayKit 相比 AirPlay開發(fā)和維護簡單;
2、ReplayKit 受限于系統(tǒng)的版本,但不需要后臺保活;
3、Airplay 需要引入AirServer,但其擴展性高;
4、Airplay由于使用私有API,有上架風(fēng)險,而ReplayKit無;
5、Airplay相對于ReplayKit用戶的使用成本相對要低
6、參考資料
國外大神Airplay協(xié)議詳解
金山云Airplay Screen Mirroring文檔
蘋果官方Bonjour介紹
騰訊云直播-錄屏
replaykit發(fā)展








