導入
scrcpy は「Android 画面を PC にミラーリングしつつ操作もできる」便利なツールですが、内部的にはどのように処理されているのか
本記事ではPCからAndroidをミラーリングするまでの流れと、どのように高速・低遅延を実現しているかをまとめています
📡 1. ADB(Android Debug Bridge)で接続する
scrcpy は Android と通信する際、すべて ADB を使います。
つまり、Android 側には専用アプリをインストールしません。
仕組み
-
PC から Android へ scrcpy-server.jar を 一時的に push
-
ADB shell 経由で server.jar を実行
-
この scrcpy-server が Android 画面をエンコード
-
PC 側 scrcpy がそのストリームを受け取る
scrcpy は「インストール不要(non-intrusive)」とよく言われるのは、この方式のおかげです。
🎥 2. Android 側:画面を取得 → 動画にエンコード
2-1. 画面キャプチャ(MediaProjection)
Android 側の scrcpy-server は MediaProjection API を使用して画面をキャプチャします。
OS が描画した直後のフレームを取得
1 フレームは数 MB 以上と巨大なので、そのまま送ると帯域不足
2-2. ハードウェアエンコード(MediaCodec)
次に MediaCodec を使って、画面を H.264 または H.265 にエンコードします。
Snapdragon / Exynos / Tensor 等の ハードウェアエンコーダを使用
ビットレートは 2〜10Mbps 程度
1080p60fps でも USB2.0 で間に合う
ここが scrcpy が速い理由
生の画面では毎秒数百 MB
しかし H.264 に圧縮すると 10Mbps 程度(約1/100)
→ USB や Wi-Fi でもリアルタイムで転送できる
📤 3. エンコード済みデータを PC に送る(ADB exec-out)
scrcpy-server は 標準出力(stdout)に H.264 / H.265 のバイト列 を吐き出します。
PC 側では実質こういう流れになっています:
adb exec-out scrcpy-server.jar # stdout から動画ストリームを受信
専用プロトコルなし(ただのバイト列)
USB / Wi-Fi どちらでも同じ仕組み
中間層がないため高速・低遅延
🖥 4. PC 側:デコードして画面に描画
PC 側の scrcpy(C/C++ 製)は以下を担当します:
4-1. デコード(FFmpeg / SDL2)
H.264/H.265 を PC 側でデコード
GPU デコードが可能で非常に高速
1 フレーム遅れ程度の低遅延
4-2. ウィンドウに描画
SDL2 により、高フレームレートのまま描画されます。
5. PC → Android への入力(逆方向)
scrcpy は 操作イベントを ADB で逆方向に送ります。
例:
PC 操作 Android 側の実現方法
クリック input tap x y
ドラッグ input swipe x1 y1 x2 y2 duration
キーボード IME の commitText などを使用
つまり ミラーリングも入力も ADB 一本で成立 しています。
6. 全体フロー(図)
⚡ scrcpy が高速・低遅延な理由まとめ
- 生画像ではなく動画(H.264/H.265)で送る → 帯域激減
- Android の HW エンコーダ使用 → 超高速
- プロトコルはシンプル(ほぼバイトストリーム)
- アプリをインストールしない(毎回 server.jar を push)
- 入力は ADB shell 経由 → 追加アプリ不要
これらが組み合わさって 超軽量・超低遅延のミラーリング が実現しています。
