scrcpyで画面転送 / Android TVはウェブブラウザから画面をリモート操作される夢を見るか?

scrcpyで画面転送 / Android TVはウェブブラウザから画面をリモート操作される夢を見るか?
Page content

scrcpy 〜Androidデバイスの画面を転送&操作するツール〜

Androidデバイスの画面をパソコン側にミラー表示し、パソコン側のキーボードやマウスを使ってAndroidデバイスの操作もできる「scrcpy」というツールがある。

以前からこのツールを時々使っていて、機器同士を接続して画面をミラーするという行為が個人的に面白いし、使い道がいろいろありそうに感じているので、今回取り上げてみる。

基本編) Android画面をパソコンにミラー表示&操作

Case-1. AndroidガラケーとUSBケーブル接続

SEIKO 【SIMロック解除済】SoftBank Simply 602SI レッド

SEIKO 【SIMロック解除済】SoftBank Simply 602SI レッド

たまたま手元にあったAndroidガラケー SII 602SI Simply (NP603SI) (Android 6) と、scpcpyは接続できるのかどうか。試している最中に、すでに同じことをやっている方を発見した。

使い道が定まらない実験用のuConsoleをせっかくだから引っ張り出し、この端末とSimplyの組み合わせでscrcpyを試してみる。

## uConsoleにaptで導入したadbのバージョンを確認
$ adb version
Android Debug Bridge version 1.0.41
Version 28.0.2-debian
Installed as /usr/lib/android-sdk/platform-tools/adb

uConsoleのOSはRaspberry Pi OSベース、すなわちDebianベースである。そのせいかどうかは分からないが、上記の参考ページで説明されているUbuntuと同様に、次のファイル/etc/udev/rules.d/80-np603si.rulesの追加が必要だった。(ちなみに、後述のCase-2で用いたMacOS環境へbrewで導入したscrcpyは、特別な設定なくSimplyと接続できた)

$ cd /etc/udev/rules.d/
$ sudo vim ./80-np603si.rules
$ sudo chmod 644 ./80-np603si.rules
$ cat ./80-np603si.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="2a9e", MODE="0666", GROUP="plugdev"

上記ファイル80-np603si.rulesの中に登場している「2a9e」は、SimplyのベンダーIDで、lsusbコマンドの出力においても確認できる。

$ lsusb
Bus 001 Device 005: ID 2a9e:0116 Android Android
Bus 001 Device 004: ID 1eaf:0024 Leaflabs uConsole
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

接続方法

  1. Simply上の操作でAndroidの「開発者向けオプション」と「USBデバッグ」をONにする
  2. SimplyとuConsoleをUSBケーブルで接続してからscrcpyを実行する
    $ scrcpy --fullscreen # ついでに全画面表示を指定
    
  3. Simply画面のミラー表示が開始される

uConsole側にキー入力を行うことによってSimplyを操作することも可能だ。

Case-2. AndroidスマホとWi-Fi接続

【日本正規代理店品】Xiaomi Redmi Note 10 Pro 日本語版 6+128GB SIMフリースマホ本体 スマートフォン本体 1億800万画素 120Hz AMOLED (オニキスグレー)

【日本正規代理店品】Xiaomi Redmi Note 10 Pro 日本語版 6+128GB SIMフリースマホ本体 スマートフォン本体 1億800万画素 120Hz AMOLED (オニキスグレー)

シャオミ(Xiaomi)

次に、Androidスマホ Xiaomi Redmi Note 10 Pro (M2101K6G) (Android 13) とMacOSとの間で、scrcpyによるWi-Fi接続を行ってみた。MacOSへのadbの導入にはbrewを使っている。

## MacOSにbrewで導入したadbのバージョンを確認
$ adb version
Android Debug Bridge version 1.0.41
Version 34.0.5-10900879
Installed as /opt/homebrew/bin/adb
Running on Darwin 22.6.0 (arm64)

接続方法

  1. スマホ上の操作でAndroidの「開発者向けオプション」と「ワイヤレスデバッグ」をONにし、「ペア設定コードでデバイスをペア設定」を選択して接続情報を表示させる
  2. 表示されているIPアドレス・ポート番号とWi-Fiペア設定コードに基づいて、Mac側で次のようにadb pair ...を実行し、Macとスマホをペアリングする
    $ adb pair 192.168.1.99:42683 474185
    Successfully paired to 192.168.1.99:42683 [guid=XXX-XXXXXXXX-XXXXXX]
    
  3. ワイヤレスデバッグの「IPアドレス&ポート」に表示されているIPアドレス・ポート番号に対して次のようにscrcpy ...を実行するとスマホ画面のミラー表示が開始される
    $ scrcpy --tcpip=192.168.1.99:40263 --print-fps # ついでにFPS表示を指定
    

なお、今回の組み合わせでは、Mac側の画面に対してマウスやキー入力を行ってもスマホ側に伝わらなかった。そのときのscrcpy起動画面にはJava関連っぽいエラーが表示されており、エラーの解消方法は不明である。

応用編) scrcpy + Apache Guacamole で、Android TVの画面をウェブブラウザでリモート操作する

ソニー 49V型 4K 液晶 テレビ ブラビア KJ-49X8000H Android TV 6畳以上推奨 2020年モデル

ソニー 49V型 4K 液晶 テレビ ブラビア KJ-49X8000H Android TV 6畳以上推奨 2020年モデル

ソニー(SONY)

ウェブブラウザからリモートデスクトップ接続することができる「Apache Guacamole」というツールについて、次の記事を先日書いた。

実はこのApache Guacamoleと今回のscrcpyを、次のように組み合わせると、Android TVの画面をリモートからウェブブラウザ越しに操作できるのでは?と気づいた。

  1. Ubuntu Desktopなどのデスクトップ環境で1つ専用のものを用意し、RDP接続可能なように設定する
  2. そのデスクトップ環境を、Apache Guacamoleを通じて操作できるようにする
  3. そのデスクトップ環境に、Android TVの画面をscrcpyを使って全画面表示する

実際にやってみた様子を次の画面キャプチャで示す。Android TVとしては SONYのブラビア (KJ-49X8000H) (開発者向けオプションの有効化などは実施済み) を用いている。こんな仕掛けは、決して広く需要があるわけではない、一部にしかウケない、特殊な業務用途 (謎) にしか役に立ちそうにないものではあるが、ざっと、作り方をメモしておく。

Android TVの画面をウェブブラウザで操作する仕掛けの作り方

以下、デスクトップ環境としてUbuntu Desktopを利用する場合。Ubuntu Desktopマシンの起動後にscrcpyが自動実行され、Android TVの画面表示までが行えるように設定する。

  1. Android TVのIPアドレスを固定しておく
  2. Ubuntu Desktopのデスクトップ環境で一度、scpcpyとAndroid TVを接続してデバッグの承認操作などを行い、TVの画面がデスクトップ画面上に転送できるようにする
  3. Ubuntu Desktopの [アプリケーション表示] > [設定] > [ユーザー] > [自動ログイン] を有効にする
  4. [アプリケーション表示] > [設定] > [共有] > [リモートデスクトップ] にてリモートデスクトップ機能を有効にする
  5. 自動ログイン有効時にリモート接続時のパスワードを固定化するためには、キーリングの暗号化がされていない必要があるので次の設定変更を行う (参考リンク: Ubuntu22.04 でリモート接続のパスワードが煩わしい: すらメモらんだむ)
    1. [アプリケーション表示] > [ユーティリティ] > [パスワードと鍵] を起動する
    2. 左メニューの [パスワード] を右クリックして「パスワードの変更」を選択する
    3. 元のパスワードとして以前 (現在) のものを入力し、新しいパスワードは空白のままにして「続ける」を選択する
  6. [アプリケーション表示] > [設定] > [解像度] でデスクトップサイズを1920x1080に固定する
  7. 後述のshellスクリプト loop_scrcpy.sh を作成する
  8. 後述の自動起動スクリプト loop_scrcpy.sh.desktop を作成する
  9. Ubuntu Desktopマシンを再起動してみる
    • 問題がなければ、自動ログインによりデスクトップ画面まで進み、次にscrcpyが起動して、Android TVの画面がデスクトップ上に表示される状態になる
  10. ウェブブラウザでApache Guacamoleを開き、Ubuntu Desktopのデスクトップ環境に接続する

以上の全てが実施できれば、目的の仕掛けが完成していることになる。

所感

Android TVの画面をウェブブラウザで操作するという今回の仕掛けは、「PoC (Proof of Concept)」として作ってみて実際に動かし、なんだかとても面白いぞと感じた。adbコマンドやscrcpyを直接使わなくても、言い換えれば使えないユーザであっても、Android TVの画面をリモートから確認できるようになる。また、Android TVを別のAndroidデバイスに置き換えると、別種の新しいことができるかもしれない。

他方、今回の実験環境において期待通りでなかったのは、画面の書き換え速度と操作に対する反応速度が芳しくなかった点だ。その大きな要因としては、Full HD (1920x1080) サイズの画面データの転送とそれに伴う変換処理を、ブラビア → scrcpyを動作させた仮想マシンA (デスクトップ環境に描画) → Apache Guacamoleを動作させた仮想マシンB → 手元PCのブラウザ という多段な経路で行っていることが考えられ、構成上“さもありなん”とも言える。

使用スクリプトなど

loop_scrcpy.sh

  • 設置場所とpermission設定: /home/foobar/bin/loop_scrcpy.sh (755)
  • スクリプト本体:
    #!/bin/bash
    
    # loop_scrcpy.sh
    # ブラビアに接続してscrcpyで画面表示 (Ver.20231020)
    
    HOST=$1
    HOST_DEFAULT=XXX.XXX.XXX.XXX # Android TVの固定IPアドレス
    WAIT_SEC=10
    
    # HOSTがカラだったらデフォルト値を使う
    if [ -z "${HOST}" ]; then 
    	HOST=${HOST_DEFAULT}
    fi
    
    while true
    do
    	scrcpy \
    		--tcpip=${HOST} \
    		--disable-screensaver \
    		--print-fps \
    		--fullscreen \
    		--power-off-on-close \
    		#--no-power-on
    	echo ${WAIT_SEC}秒後にscrcpyを起動します
    	sleep ${WAIT_SEC}
    done
    

loop_scrcpy.sh.desktop

  • 設置場所: ~/.config/autostart/loop_scrcpy.sh.desktop
  • ファイル本体:
    [Desktop Entry]
    Type=Application
    Exec=gnome-terminal -e "bash -c '/home/foobar/bin/loop_scrcpy.sh; $SHELL'"
    Hidden=false
    NoDisplay=false
    X-GNOME-Autostart-enabled=true
    Name[en_US]=loop_scrcpy
    Name=loop_scrcpy
    Comment[en_US]=
    Comment=
    

参考リンク