[英]Android, Screen capture
我正在構建一個應用程序,該應用程序應為具有Android 4及更高版本的任何無根設備實現屏幕“鏡像”功能,啟動2幀/秒就足夠了。
我正在嘗試使用ADB“ framebuffer:”命令來抓取設備屏幕截圖
ADB USB通信協議是面向消息的(不是流式的),因此,要獲取數據塊,需要接收/發送一組已讀(A_WRTE @ 4096bytes)/確認(A_OKEY @ 24bytes)命令對。
只要接收方沒有發送A_OKEY,設備就不會推送其他數據(因此,不是流協議)。
為了優化性能,我直接實現了ADB USB協議,而不是使用ADB.exe
三星Galaxy 5設備的圖像具有1920 * 1080的分辨率和32位深度,因此,RAW幀緩沖圖像的權重為1920 * 1080 * 4 = 8294400字節(對於iPAD,它甚至更大),使用通過面向ADB消息的協議的“ framebuffer:”命令大約需要2秒鍾才能收到一個屏幕截圖(grrr ..)。
如果這將是流協議,則在USB 2.0 @ 480Mbps上應該花費約150毫秒
PS
我已經嘗試過ASL項目,因為ADB.exe Shell並未以系統特權運行(而是在“ shell”帳戶下運行),所以它在我的“三星Galaxy 5”上不起作用。
在Android 4.3及更高版本上,您可以執行screenrecord
操作,並將鏡像的虛擬顯示輸入視頻編碼器。 帶有5.0“ Lollipop”的1.2版具有內置的USB流傳輸功能,其中包括termio代碼,可通過adb shell
發送二進制數據。 使用“ hidden”參數--output-format=h264
並指定連字符( -
)作為輸出文件名。
源代碼在frameworks / av / cmds / screenrecord中 。
這是通過USB獲得體面幀速率的唯一方法。 您可以通過指定--output-format=raw-frames
來嘗試未壓縮的數據,但是即使在VGA分辨率下,也無法以適當的速度獲得幀。
FWIW,當前的設備通常不在恢復模式下使用幀緩沖區dev。 取而代之的是,它們使用覆蓋層,這些覆蓋層是在掃描顯示時由硬件編輯器組合而成的。 完整細節在體系結構文檔中 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.