天天看點

Android技術分享| 一行代碼實作安卓螢幕采集編碼

越來越多的App需要共享手機螢幕給他人觀看,特别是線上教育行業。Android 從5.0開始支援了MediaProjection,利用MediaProjection ,可以實作截屏錄屏功能。

本庫對螢幕采集編碼進行了封裝,簡單的調用即可實作MediaProjection權限申請,H264寫死,錯誤處理等功能。

Android技術分享| 一行代碼實作安卓螢幕采集編碼

适配安卓高版本

使用 MediaCodec 異步寫死

編碼資訊可配置

通知欄顯示

鍊式調用

源碼位址

startActivityForResult 是需要在 Activity 或者 Fragment中使用的,授權結果會在 onActivityResult 中回調。是以我們需要對這一步進行一個封裝,使其能以回調到方式拿到結果。這裡我們采用一個無界面的 Fragment,有很多庫都是使用這種形式。

這樣我們就可以在一個無界面的 Fragment 中拿到 onActivityResult中的授權結果和 MediaProjection 對象。

如果 targetSdkVersion 設定的 29及以上,在擷取到 MediaProjection 後調用 createVirtualDisplay ,将會收到一條異常

意思是說,這個操作需要在前台服務中進行。

那我們就寫一個服務,并把 onActivityResult 擷取到的結果全傳過去。

在 startProjection 方法中,我們需要擷取 MediaProjectionManager,再擷取 MediaProjection,接着建立一個虛拟顯示屏。

在 createVirtualDisplay 方法中,有一個 Surface 參數,螢幕上的所有動作,都會映射到這個 Surface 中,這裡我們使用 MediaCodec 建立一個輸入Surface用來接收螢幕的輸出并編碼。

以上進行了一些正常的配置,MediaFormat 可以為編碼器設定一些參數,比如碼率,幀率,關鍵幀 間隔等。

MediaCodec 編碼提供同步異步兩種方式,這裡采用異步設定回調的方式(異步 API 21以上可用)

在 onOutputBufferAvailable 回調中,我已經将編碼後的資料回調出去,并且判斷了是關鍵幀還是普通幀。那封裝這個庫有什麼用呢????

其實,可以結合一些第三方的音視訊SDK,直接将編碼後的螢幕流資料通過第三方SDK推流,就能實作螢幕共享功能。

這裡以 anyRTC 音視訊SDK的 pushExternalVideoFrame方法為例

幾行代碼就可以實作螢幕采集編碼傳輸~非常的友善

參考