一、錄屏推流實現的步驟
1. 采集數據
主要是采集屏幕獲得視頻數據,采集麥克風獲得音頻數據,如果可以實現的話,我們還可以采集一些應用內置的音頻數據。
2. 數據格式轉換
主要是將獲取到的視頻和音頻轉換成常見的推流的標准格式,這樣能保證讓觀看終端正常觀看。
3. 編碼處理
如果不進行編碼的話,數據量會非常大,這樣不僅浪費帶寬,而且會浪費觀看終端的性能,所以需要對音視頻數據進行編碼處理。
4. 封包&推流
這塊的邏輯可以采用和普通的直播方式進行封裝和推流。
總結:其實錄屏推流直播和普通的直播的區別就是采集源發生了變化,而在技術層面來將真正需要我們做的事情就是將錄屏獲取到的數據處理成穩定的編碼格式。
二、Android 實現錄屏功能的思路
Android 實現錄制屏幕的功能的技術方案現階段主要為以下兩種:
1、Android5.0以下,獲取root權限使用 adb shell screenrecord 命令功能進行錄制。
2、Android5.0以上,使用系統Api功能:MediaProjection 和 VirtualDisplay。
目前的主流實現和使用的思路為: MediaProjection + VirtualDisplay 方法。
這兩種方式其實在底層的實現機制是一樣的,因為在5.0之前,Google可能介於錄制屏幕功能具有一定的危險性,所以就沒有開放此功能。在Android 5.0 發布后,谷歌開放了截屏的接口,我們可以通過VirtualDisplay來實現錄屏的視頻源數據的獲取。
注:此API在Android 6.0之前存在UI漏洞,具體可參見:https://blog.csdn.net/jiangwei0910410003/article/details/52135654。
在編寫App的時候,如果不想某些應用的頁面被錄屏軟件捕捉,可以在所在頁的代碼中添加WindowManager.LayoutParams.FLAG_SECURE 屬性。
1. 使用命令行錄制屏幕
在Android 5.0 以下,我們截屏可以使用 adb shell screencap 命令,錄制屏幕可以使用 adb shell screenrecord。
這里我們講一下錄制屏幕的命令行的使用方式:
(1). 基本使用
adb shell screenrecord /sdcard/demo.mp4
命令說明:錄制手機屏幕,視頻格式為mp4,存放到手機sd卡里,默認錄制時間為180s。
(2). 限制錄制時間
參數: --time-limit
adb shell screenrecord --time-limit 10 /sdcard/demo.mp4
命令說明:限制視頻錄制時間為10s,如果不限制,默認180s
(3). 指定視頻分辨率大小:
參數: --size
adb shell screenrecord --size 1280*720 /sdcard/demo.mp4
命令說明:錄制視頻,分辨率為1280*720,如果不指定默認使用手機的分辨率,為獲得最佳效果,請使用設備上的高級視頻編碼(AVC)支持的大小
(4). 指定視頻的比特率:
參數: --bit-rate
adb shell screenrecord --bit-rate 6000000 /sdcard/demo.mp4
命令說明:指定視頻的比特率為6Mbps,如果不指定,默認為4Mbps. 你可以增加比特率以提高視頻質量或為了讓文件更小而降低比特率
備注:
1. 此錄制方式不支持聲音,需單獨錄制。
2. 此命令使用需要Root權限,很大程度上限制了使用。
3. 隨着Android的版本不斷升級,我們更建議使用MediaProjection類來進行屏幕錄制。
2. 使用 MediaProjection+VirtualDiaplay錄制屏幕
// TODO