28

最近、私はadbを使用して Android フォンの画面をリアルタイムで表示および制御できる PC クライアントを作成しました。私は猿を使ってデバイスを制御していますが、うまくいきます。問題は、どうやって電話画面を掴んでスムーズに表示するかです。

私が思いついた最初の解決策は、継続的にframebufferスルーを取得することadbです (DDMS のスクリーン キャプチャ機能のように)。今、私がそれを行うと、パフォーマンスはまったく受け入れられません. からキャプチャされるフレーム レートframebufferは、1 秒あたり 5 という低さです (フレーム サイズは 800 * 480 です)。電話でスライドすると、プログラムがしゃっくりしているように見えます。

ddmslib私のプログラムは、を使用してJava で書かれていframebufferます。

追加:生データをフォーマット
にエンコードするのが非常に遅いことがわかりました。それ以外の場合、これは圧縮生画像を送信する高速な方法です。framebuffer.png

画面のキャプチャ速度を滑らかなレベルまで改善するにはどうすればよいですか?

4

12 に答える 12

27
adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen.png

ソース:

http://blog.shvetsov.com/2013/02/grab-android-screenshot-to-computer-via.html

于 2013-08-29T18:54:40.500 に答える
12

あなたが使用することができます:

$ adb exec-out screencap -p > test.png

アップデート

Android 11 では、wifi 経由のデバッグが導入され、処理が少し高速化されます

$ time adb exec-out screencap -p > test.png

real    0m0.661s
user    0m0.050s
sys 0m0.066s

2021年9月更新

CulebraTester2のスクリーンショットを使用すると、より高いフレーム レートを実現できます。

./take-screenshot 

 Image in file:///tmp/culebra.zSSYZ6VG.png

于 2012-12-21T05:43:19.283 に答える
9

遅い部分が raw から png への変換であり (ゲームで使用しているため、time adb shell screencap -p /sdcard/x.pngよりもかなり遅いtime adb shell screencap /sdcard/nonpng.raw)、png が必要ない場合は、ここでhttps://github.com/sowcow/shotのようにすることができます。raw データを単純な ppm 形式に変換し、imagemagick を使用して ppm を bmp に変換します。生データを取得した後、オーバーヘッドはほとんどありません。

更新:

max_plenert によるこのシェル スクリプトは、より良い例です。

adb shell screencap /sdcard/mytmp/rock.raw
adb pull /sdcard/mytmp/rock.raw
adb shell rm /sdcard/mytmp/rock.raw

// remove the header
tail -c +13 rock.raw > rock.rgba

// extract width height and pixelformat:
hexdump -e '/4 "%d"' -s 0 -n 4 rock.raw
hexdump -e '/4 "%d"' -s 4 -n 4 rock.raw
hexdump -e '/4 "%d"' -s 8 -n 4 rock.raw

convert -size 480x800 -depth 8 rock.rgba rock.png
于 2014-11-24T06:06:44.607 に答える
4

私のMacの.bash_profileでは:

function droidShot() {
  /full_path_to_droid_sdk/platform-tools/adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > $1.png
}

利用方法:

droidshot whatever

ファイルはwhatever.pngに表示されます

于 2014-08-28T02:30:28.370 に答える
0

@stevehaのソリューションを改善しました:

次の内容の「 android-screenshot 」というシェル スクリプトを作成します。

adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen-`date +%Y-%m-%d_%X`.png

このファイルをローカルの bin ディレクトリまたは任意の$PATHに配置します。

これにより、ファイルをタイムスタンプ付きで現在のディレクトリに保存できます。

を使用してシェルスクリプトを実行可能にすることを忘れないでください

chmod +x android-screenshot
于 2014-02-11T13:33:42.960 に答える
0

screenrecordAndroid 4.4の時点でプログラムがあります

adb shell screenrecord /data/local/tmp/test-video.m4v
adb pull /data/local/tmp/test-video.m4v ~/test-video.m4v
于 2015-03-02T16:58:45.090 に答える