手遊錄屏直播技術詳解 | 直播 SDK 效能優化實踐

七牛雲發表於2016-12-28

直播無疑是 2016 年的大熱話題,七牛雲在 6 月底釋出了實時流網路 LiveNet 和直播雲解決方案後,我們用《直播技術詳解》系列文章系統地介紹了直播各個環節的關鍵技術,幫助視訊直播創業者們更全面、深入地瞭解直播技術,更好地技術選型。

《直播 SDK 效能優化實踐》系列文章是介紹七牛雲在直播 SDK 上的技術創新實踐。

在上期《直播推流端弱網優化策略 》中,我們介紹了直播推流端是如何優化的。本期,將介紹手遊直播中錄屏的實現方式。


直播經過一年左右的快速發展,衍生出越來越豐富的業務形式,也覆蓋越來越廣的應用領域。手遊直播就是現在常見的一種新興應用場景。手遊直播與一般直播最大的不同點,同時也是它的技術難點,在於錄屏技術。遊戲玩家錄屏功能,實時地把自己玩遊戲的場景分享展示給其他觀眾。錄屏給很多遊戲製作平臺和直播內容平臺提供了一種新的產品思路。

錄屏實現的四個步驟:

  1. 採集:獲取螢幕採集的視訊資料、麥克風採集的音訊資料、遊戲內建的音訊資料。

  2. 處理:轉化成可以推流的標準格式,防止推出的流有問題。

  3. 編碼:處理好硬編支援,節省終端的效能開銷。

  4. 封包、推流:和普通的直播方式一樣處理。

從以上的錄屏步驟來看,錄屏直播和普通直播的採集源發生了變化。而真正實現錄屏直播功能,則需要我們獲取到資料,處理成能更穩定編碼、推流的格式,最後才能穩定高質量地推出視訊流。

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 的錄屏方案


image-11

  1. 遊戲端自己要實現 ReplayKit 被錄製端的協議;
  2. 錄製平臺整合最新版本的七牛直播 SDK ;
  3. 錄製平臺建立 Broadcast Upload Extension,讓支援 ReplayKit 的遊戲可以被錄製;
  4. 新增推流管理類,拿到 ReplayKit 資料後推流出去。

iOS ReplayKit 錄屏方案 demo

 

七牛 Android 的錄屏方案


  1. 更新最新版本的七牛直播 SDK ;
  2. AndroidManifest.xml 註冊 ; <activityandroid:name="com.qiniu.pili.droid.streaming.screen.ScreenCaptureRequestActivity"android:theme="@android:style/Theme.Translucent.NoTitleBar" ></activity>

  3. 使用七牛提供的核心類 ScreenStreamingManagerScreenStreamingManager 封裝螢幕的錄製、音訊的採集,編碼,封包和推流操作。使用者只需要簡單的呼叫相關 API 即可實現錄屏推流。 4

在當你想在自己的產品中加入錄屏直播功能,那麼需要考慮清楚到底是自研還是使用三方的 SDK。如果採取自研方案,那麼可以參考以上的錄屏思路,你還需要仔細瞭解系統平臺的 API 介紹。如果採用第三方 SDK 則可以較快整合,但需要了解 SDK 穩定性和易用性,且仔細閱讀 SDK 的使用細則。 

相關文章