在上期《直播推流端弱網優化策略 》中,我們介紹了直播推流端是如何優化的。本期,將介紹手游直播中錄屏的實現方式。
直播經過一年左右的快速發展,衍生出越來越豐富的業務形式,也覆蓋越來越廣的應用領域。手游直播就是現在常見的一種新興應用場景。手游直播與一般直播最大的不同點,同時也是它的技術難點,在於錄屏技術。游戲玩家錄屏功能,實時地把自己玩游戲的場景分享展示給其他觀眾。錄屏給很多游戲制作平台和直播內容平台提供了一種新的產品思路。
錄屏實現的四個步驟:
-
采集:獲取屏幕采集的視頻數據、麥克風采集的音頻數據、游戲內置的音頻數據。
-
處理:轉化成可以推流的標准格式,防止推出的流有問題。
-
編碼:處理好硬編支持,節省終端的性能開銷。
-
封包、推流:和普通的直播方式一樣處理。
從以上的錄屏步驟來看,錄屏直播和普通直播的采集源發生了變化。而真正實現錄屏直播功能,則需要我們獲取到數據,處理成能更穩定編碼、推流的格式,最后才能穩定高質量地推出視頻流。
iOS 的錄屏思路簡述
- ReplayKit
ReplayKit 是蘋果 iOS 10 以上版本提供的用於錄屏並對外直播的功能。簡單而言就是蘋果通過這個功能把采集到的屏幕視頻信息和音頻信息回調給開發者,開發者可以任意處理這些信息。
但是問題是,ReplayKit 使用上限制較多,首先要求系統必須為 iOS 10 以上;其次,被錄屏的 App 必須支持 ReplayKit 功能。這也很容易理解,畢竟錄屏是比較敏感的行為。所以必須游戲本身支持,以表示被錄制方已經同意錄屏。
熊貓 TV 作為國內首家支持 ReplayKit Live 的直播平台,開創了直播行業的先河。熊貓 TV iOS 上的錄屏方案采用七牛提供的 ReplayKit 方案實現。
- Airplay Mirroring
Airplay Mirroring 是蘋果用於屏幕投影的功能,投屏的原理就是把設備的屏幕數據和音頻數據通過 Airplay Mirroring 協議傳輸給第三方的支持該協議的顯示播放設備。但 Airplay Mirroring 是蘋果的私有協議,傳輸過程中音視頻數據都是被蘋果加密的,不對第三方開放。因此要想獲得這些數據,只能通過破解協議的方式來達成。
優缺點分析

Android 的錄屏思路簡述
- View.getDrawingCache() 方法
通過 View 的 cache 內容獲取到 Bitmap 對象來達到錄屏的效果。但是很多手機上面該方式會存在性能問題,另外該方式並不是一個真正意義上的錄屏方式,另外部分 View 組件的內容並不能獲取到,比如 webview 。
- 讀取 /dev/graphics/fb0 方法
Android 基於 Linux,所以可以通過讀取 fb0 設備節點,即 framebuffer 中的幀數據來實現屏幕的錄制。但是讀取這個設備節點需要 root 權限。
- screencap -p xxx.png/screenshot xxx.png 方法
screencap 是 Android shell 的命令,可以通過該 shell 命令讀取到屏幕的幀數據來達到錄屏的功能。但該命令仍然需要 root 權限。
- MediaProjection + VirtualDisplay (>= 5.0) 方法
在 Android 5.0 以后,Google 開放了截屏的接口,可以通過「虛擬屏幕」來實現錄屏。該方式是目前 PLDroidMediaStreaming 采用的方式。
七牛 iOS ReplayKit 的錄屏方案

1. 游戲端自己要實現 ReplayKit 被錄制端的協議;
2. 錄制平台集成最新版本的七牛直播 SDK ;
3. 錄制平台創建 Broadcast Upload Extension,讓支持 ReplayKit 的游戲可以被錄制;
4. 添加推流管理類,拿到 ReplayKit 數據后推流出去。
iOS ReplayKit 錄屏方案 demo

七牛 Android 的錄屏方案
1. 更新最新版本的七牛直播 SDK ;
2. AndroidManifest.xml 注冊 ;
<activity android:name="com.qiniu.pili.droid.streaming.screen.ScreenCaptureRequestActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" > </activity>
3. 使用七牛提供的核心類 ScreenStreamingManager、ScreenStreamingManager 封裝屏幕的錄制、音頻的采集,編碼,封包和推流操作。用戶只需要簡單的調用相關 API 即可實現錄屏推流。

在當你想在自己的產品中加入錄屏直播功能,那么需要考慮清楚到底是自研還是使用三方的 SDK。如果采取自研方案,那么可以參考以上的錄屏思路,你還需要仔細了解系統平台的 API 介紹。如果采用第三方 SDK 則可以較快集成,但需要了解 SDK 穩定性和易用性,且仔細閱讀 SDK 的使用細則。
直播無疑是 2016 年的大熱話題,七牛雲在 6 月底發布了實時流網絡 LiveNet 和直播雲解決方案后,我們用《直播技術詳解》系列文章系統地介紹了直播各個環節的關鍵技術,幫助視頻直播創業者們更全面、深入地了解直播技術,更好地技術選型。
《直播 SDK 性能優化實踐》系列文章是介紹七牛雲在直播 SDK 上的技術創新實踐。歡迎探討。
本文作者:@七牛雲 pili 技術團隊
