1、課程簡介
本課程主要講解窃爷,如何在iOS系統(tǒng)的設備上實現(xiàn)按厘,錄制屏幕的方案逮京。主要使用iOS系統(tǒng)的Airplay功能和ReplayKit庫實現(xiàn)屏幕錄制滩字。
2.課程目標
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 功能揍诽,設備在自己上發(fā)布Airplay服務,通過控制中心選擇服務節(jié)點渠啤,系統(tǒng)Airplay進程響應沥曹,并開始錄制視頻數(shù)據(jù)妓美,發(fā)送數(shù)據(jù)給Airplay service,App接收到數(shù)據(jù)辰如,發(fā)送到公網(wǎng)琉兜。
4.1.2 AirPlay呕童?
百度搜索結(jié)果
WIKI英文搜索結(jié)果
通過以上結(jié)果夺饲,可以發(fā)現(xiàn)還是英文資料比較準確往声,偏向于技術(shù)解釋:
AirPlay是Apple Inc.開發(fā)的一個專有協(xié)議棧/套件浩销,允許音頻听哭、視頻陆盘、設備屏幕和照片設備之間的無線流隘马,以及相關(guān)的元數(shù)據(jù)。
Airplay協(xié)議詳解
協(xié)議集
4.1.3 Bonjour?
在過去二十年中幔嗦,計算機逐漸從特定于平臺的協(xié)議(如AppleTalk邀泉,IPX和NetBIOS)轉(zhuǎn)向Internet協(xié)議(IP)。大多數(shù)計算機和其他網(wǎng)絡設備都使用TCP / IP進行通信寞埠。然而焊夸,在這種轉(zhuǎn)變中阱穗,丟失了一項功能 - 能夠?qū)⒃O備添加到本地網(wǎng)絡揪阶,然后從網(wǎng)絡上的計算機和其他設備連接到這些設備鲁僚,所有這些都很少或沒有配置。
要使IP工作侨艾,每個設備都需要一個唯一的地址唠梨,無論是靜態(tài)分配還是由DHCP服務器動態(tài)分配侥啤。動態(tài)分配的地址可以更改盖灸,因此糠雨,如果沒有Bonjour甘邀,必須使用靜態(tài)地址手動配置打印機和其他設備垮庐,以便網(wǎng)絡上的計算機可以訪問它們。然后哨查,網(wǎng)絡管理員必須配置DNS服務器逗抑,以便計算機用戶不必通過IP地址連接到打印機。因此,看似微不足道的任務需要重要的配置邮府。因為不適合網(wǎng)絡管理員的傳統(tǒng)角色的人經(jīng)常建立通過共享路由器將他們的筆記本電腦連接到互聯(lián)網(wǎng)的網(wǎng)絡系列荧关,例如,這種配置水平是不切實際的褂傀。
甚至在IT專業(yè)人員運營的托管網(wǎng)絡中忍啤,要求對打印機等設備進行手動配置也沒有意義。人們期望能夠插入打印機仙辟,將兩臺筆記本電腦連接在一起,或者在本地網(wǎng)絡上查找文件服務器或游戲服務器叠国,而不必浪費時間嘗試正確配置未檩。
為了支持這一點,人們需要一種簡單可靠的方法來配置和瀏覽IP網(wǎng)絡上的服務粟焊。他們希望發(fā)現(xiàn)可用的服務并從列表中選擇一個冤狡,而不必提前知道每個服務的名稱或IP地址。具備此功能的IP符合每個人的利益项棠。這正是Bonjour提供的功能筒溃。
Bonjour是Apple關(guān)于IP零配置網(wǎng)絡的提議。 Bonjour來自ZEROCONF工作組的工作沾乘,ZEROCONF工作組是互聯(lián)網(wǎng)工程任務組(IETF)的一部分怜奖。 ZEROCONF工作組的要求和基于IP的零配置網(wǎng)絡的建 議解決方案基本上涵蓋三個方面:
尋址(為主機分配IP地址)
命名(使用名稱來引用主機而不是IP地址)
服務發(fā)現(xiàn)(自動在網(wǎng)絡上查找服務)
Bonjour針對所有這三個領(lǐng)域提供零配置解決方案,如以下四個部分所述翅阵。
Bonjour允許服務提供商歪玲,硬件制造商和應用程序員支持單一網(wǎng)絡協(xié)議-IP,同時在易用性方面開辟了新天地掷匠。
網(wǎng)絡用戶不再需要分配IP地址滥崩,分配主機名,甚至不必輸入名稱來訪問網(wǎng)絡上的服務讹语。用戶只需要查看可用的網(wǎng)絡服務钙皮,并從列表中進行選擇。
在許多方面顽决,這種瀏覽對應用程序而言比用戶更強大短条。應用程序可以自動檢測他們需要的服務或他們可以與之交互的其他應用程序,允許自動連接才菠,通信和數(shù)據(jù)交換茸时,而無需用戶干預。
服務發(fā)布
服務發(fā)現(xiàn)
服務地址解析
Bonjour使用了幾種機制來減少零配置開銷赋访,包括緩存可都、抑制重復響應缓待、指數(shù)退避和服務公告,如以下部分所述渠牲。
Bonjour使用多播DNS記錄的緩存來防止主機請求已經(jīng)請求的信息旋炒。例如,當一個主機請求一個LPR打印后臺處理程序列表時签杈,打印機列表通過多播返回国葬,因此所有本地主機都能看到它。下次主機需要打印后臺處理程序列表時芹壕,它的緩存中已存在該列表汇四,不需要重新發(fā)出查詢。多播DNS響應程序負責維護緩存踢涌;應用程序開發(fā)人員不需要做任何事情來維護緩存通孽。 為了防止對同一查詢的重復回答,Bonjour服務查詢包括已知答案的列表睁壁。例如背苦,如果主機正在瀏覽打印機,則第一個查詢不包含打印服務潘明,例如行剂,從可用的打印服務器獲得12個答復。下次主機查詢打印服務時钳降,該查詢包含已知服務器的列表厚宰。列表中已存在的打印服務器沒有響應。
Bonjour以另一種方式抑制重復的響應遂填。如果一個主機即將響應铲觉,并且注意到另一個主機已經(jīng)用相同的信息響應,那么該主機將抑制其響應吓坚。 應用程序開發(fā)人員不需要采取任何措施來抑制重復的響應撵幽。Bonjour處理重復的響應抑制。
當主機在瀏覽服務時礁击,它不會連續(xù)發(fā)送查詢來查看是否有新的服務可用盐杂。相反,主機發(fā)出一個初始查詢并以指數(shù)形式較少地發(fā)送后續(xù)查詢哆窿,例如:1秒链烈、3秒、9秒更耻、27秒等之后测垛,最長間隔為一小時。 這并不意味著瀏覽器要花一個多小時才能看到新的服務秧均。當一個服務在網(wǎng)絡上啟動時食侮,它會使用類似的指數(shù)退避算法宣布它的存在幾次。通過這種方式目胡,服務發(fā)布和發(fā)現(xiàn)的網(wǎng)絡流量保持在最低水平锯七,但是新的服務很快就會出現(xiàn)。 在裝備Bonjour的主機上運行的服務在向MDNSResponder守護進程注冊時自動宣布誉己。在其他硬件(如打印機)上運行的服務應該實現(xiàn)服務通告眉尸,并采用指數(shù)后退來充分利用Bonjour。
4.1.4 如何本地創(chuàng)建遠程服務結(jié)點巨双?
Bonjour服務一般用于發(fā)布服務全局廣播噪猾,但如果服務不想被其它機器知道,只有制定機器知道筑累,如何實現(xiàn):
1袱蜡、客戶端與服務器通信,等到服務器的服務ip地址慢宗,端口號
2坪蚁、客戶端本地創(chuàng)建服務結(jié)點,并連接
問題關(guān)鍵:客戶端可不可以創(chuàng)建本地服務節(jié)點:
iOS API
由于bonjour服務是開源的镜沽,且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)容錄制统阿、預覽、保存筹我、分享扶平,但是其輸出的結(jié)果其實是一個已經(jīng)將音頻、視頻編碼并交織到一起成為一個mp4文件蔬蕊,開發(fā)者只能處理這個mp4文件结澄,無法對原始音視頻數(shù)據(jù)進行處理。對于有些app可能存在諸如分辨率減小岸夯、碼率減小麻献、音頻編輯等各種需求,都需要對原始的yuv猜扮、pcm數(shù)據(jù)進行處理勉吻,或者對編碼過程進行定制化干預。
ios10的replaykit的錄制已經(jīng)跟iOS9差異很大旅赢,ios10已經(jīng)支持錄制的原始音視頻數(shù)據(jù)的 【實時】獲瘸萏摇(iOS9只可以獲取到錄制停止后編碼的mp4)惑惶,開發(fā)者可以自己進行實時分發(fā)或者編碼后處理。 iOS10只支持app內(nèi)容錄制短纵,所以當app切到后臺带污,錄制內(nèi)容將停止。
到了iOS11時代香到,蘋果終于開放了對錄制內(nèi)容的升級鱼冀,從iOS10的app內(nèi)升級到整個系統(tǒng)級別的錄制
iOS11的復雜操作啟動屏幕錄制,不知道阻塞了多少用戶的繼續(xù)使用悠就。進入到2018年的iOS12千绪,蘋果終于想通了,replaykit也迎來了柳暗花明梗脾,開發(fā)者企盼的api控制啟動錄制終于來了荸型!iOS12還是會考慮用戶的感知性,要求開發(fā)者必須通過replaykit提供的 RPSystemBroadcastPickerView 來展示啟動的view藐唠,然后通過點擊view上面的按鈕才能啟動:
4.2.3 代碼示例
4.2.4 問題&展示
ReplayKit2屏幕錄制在iOS11新推出功能帆疟,比較少官方文檔并且存在著一些問題每個版本的系統(tǒng)都在不斷修復完善中。以下是一些使用中的常見現(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才能恢復音頻采集柬脸。在11.3之后的版本系統(tǒng)修復了這個問題。
3.打開麥克風錄制時系統(tǒng)播放聲音會變小
這個是屬于系統(tǒng)機制:打開麥克風采集時系統(tǒng)音頻處于錄制模式毙驯,會自動將其它的App播放的聲音變?yōu)槁犕材J降苟椋型娟P(guān)閉麥克風采集也不會恢復,只有關(guān)閉或重新啟動無麥克風錄制時才會恢復為揚聲器的播放爆价。這個機制不影響App那路聲音的錄制垦巴,即觀眾端聲音聽到的聲音大小不受影響。
4.屏幕錄制何時自動會停止
系統(tǒng)在鎖屏或有電話打入時铭段,會自動停止屏幕錄制骤宣,此時SampleHandler里的broadcastFinished函數(shù)會被調(diào)用,可在此函數(shù)發(fā)通知提示用戶序愚。
5.采集推流過程中有時屏幕錄制會自動停止問題
通常是因為設置的推流分辨率過高時在做橫豎屏切換過程中容易出現(xiàn)憔披。ReplayKit2的直播擴展目前是有50M的內(nèi)存使用限制,超過此限制系統(tǒng)會直接殺死擴展進程,因此ReplayKit2上建議推流分辨率不高于720P芬膝。另外不建議使用autoSampleBufferSize時做橫豎屏切換望门,因為Plus的手機的分辨率可達1080*1920,容易觸發(fā)系統(tǒng)內(nèi)存限制而被強制停止,不要長時間引用
6.iphoneX手機的兼容性與畫面變形問題
iphoneX手機因為有劉海蔗候,屏幕采集的畫面分辨率不是9:16怒允,如果設了推流輸出分辨率為9:16的比例如高清里是為960*540的分辨率埂软,這時因為源分辨率不是9:16的锈遥,推出去的畫面就會稍有變形。建議設置分辨率時根據(jù)屏幕分辨率比例來設置勘畔,拉流端用AspectFit顯示模式iPhoneX的屏幕采集推流會有黑邊是正乘模現(xiàn)象,AspectFill看畫面會不全炫七。
5爬立、總結(jié)
1、ReplayKit 相比 AirPlay開發(fā)和維護簡單万哪;
2侠驯、ReplayKit 受限于系統(tǒng)的版本,但不需要后臺鞭任。活吟策;
3、Airplay 需要引入AirServer的止,但其擴展性高檩坚;
4、Airplay由于使用私有API诅福,有上架風險匾委,而ReplayKit無;
5氓润、Airplay相對于ReplayKit用戶的使用成本相對要低
6赂乐、參考資料
國外大神Airplay協(xié)議詳解
金山云Airplay Screen Mirroring文檔
蘋果官方Bonjour介紹
騰訊云直播-錄屏
replaykit發(fā)展