scrsndcpy を使って android の画面と音声を PC にストリーミングする

[2022/01/08]
Windows で動作する scrsndcpy がリリースされていたので、加筆しました。
Windows の人は基本的にこの四角枠の中は無視して大丈夫です。
LinuxmacOS の方は記事中のこの四角枠の中の情報を参考にしてください。ただし、もともと Windows 向けの解説だったため、その辺はご了承ください。

導入

android の画面を PC に映すのって、Twitch や YouTube などで配信する層にそこそこ需要がある*1と思うんですが、画面を HDMI 出力できる機種は一部の機種に限られるんですよね。
具体的には DP Alternate Mode に対応した Type-C 端子を搭載した端末で、知っている限りでは自分の使っている ROG Phone シリーズと Black Shark シリーズくらいしかありません。
探せば他にもあるようですが、ケーブル経由で画面出力できるか否かってなぜか公式サイトに載せてくれません。
自分で情報を探そうにも、対応端末であっても正しいケーブルを使わないと画面出力してくれないということを知らない人が多かったり、価格.com のようなところで質問しても碌な答えが返ってきません。
正しいケーブルというのはこういうケーブルです。*2
ただし、Full HD や16:9の 4K などといった一般的な解像度のスマホは皆無なので、ちゃんと出力してくれるかどうかは接続してみるまでわかりません。


さらに、HDMI のキャプチャーボードによっては特定の画面比率や解像度にしか対応しておらず、引き伸ばされてしまったり、出力自体をしてくれない場合もあります。

その他、ワイヤレスで画面出力できるアプリもありますが、ロゴが入ったり動きのあるゲーム向けではなかったりしていろいろ残念だったり。
しかし、これから紹介する方法では Android 10 以上の端末なら画面・音声出力ができます (画面のみなら Android 5 以上に対応)。
あと、出力されたウィンドウ内をマウスクリックするとそのまま端末の操作もできます。

画面出力非対応のPixel 6でも出力できる
イメージ図。音声はPCとスマホ両方から出る

メリット

  • 追加投資がほぼ必要ない (手持ちの android と PC だけで大抵は OK)
  • andorid 端末の音が、本体と PC 両方に出る (端末本体の音を聞けば遅延がない)
  • 低遅延
  • android 端末そのままの解像度が出せる
  • 出てきた画面をマウスで操作できる
  • キャプチャソフトで取り込めば古いスマホを Web カメラ代わりに使える

デメリット

  • Linux, macOS では少しめんどくさい
  • ミラーリングした音声と画面が若干ズレる
  • (おそらく) 端末の録画機能と同時に使用できない

もくじ

必要なもの

  • srcsndcpy
      (画面・音声取り込みに使う、PCで起動するソフトウェアです)

    Windows では srcsndcpy が出たので以下の3つはいらなくなりました (たぶんVLCもいらない)
    - scrcpy
      (画面取り込み・表示に使う、PCで起動するソフトウェアです)
    - sndcpy
      (音声取り込みに使う、PCで起動するソフトウェアです)
    - VLC
      (取り込んだ音声を再生する、PC用のソフトウェアです)

  • データ転送に対応した USB ケーブル
      (端末と PC を接続するのに使います。まれに裏表のあるケーブルがあります)

  • 開発者モードへ入れる android 端末
      (音声・画面両方は Android 10 以上必須です。Android 5 以上10未満は画面のみ)
  • USB デバッグが有効でも動作するアプリ
      (例えば銀行のアプリなど、セキュリティの厳しいアプリは無効にしないと開けないのでできません)

USB ケーブルはこの辺のやつでいいと思います。USB 3.x (Gen x) 表記のあるものならよっぽど変なメーカーではない限り大丈夫なはずです。*3

USB2.0 のケーブルでも大丈夫だと思います。
が、新しく買う前に手持ちのケーブルでも動くか試してみましょう。

準備

PCでの準備

github.com Windowsの場合は 上記ページから scrsndcpy_x.x.zip をダウンロードし、右クリックからファイルを展開もしくは解凍してください。

解説は Windows 想定ですが、 LinuxmacOS の場合はこちらをおこなってください。

VLC のインストール (Linux)

www.videolan.org

上記 VLC 公式サイトからダウンロード、インストールしてください。
インストール後、VLC は起動しなくて大丈夫です。
VLC自体は多機能の動画プレイヤーです
普段使っているプレイヤーを変えたくない場合は、インストール途中、チェックボックスがいっぱいあるところで「ファイルタイプの関連付け」系のチェックボックスを全部外してください。

scrcpy、sndcpy のダウンロード (Linux)

github.com

上記 GitHub ページの「Get the app」のところから Windows 用の zip をダウンロードしてください。

github.com

こちらも同様に「Get the app」のところから with-adb-windows と書いてある方の zip をダウンロードしてください。
両方ダウンロードしたら、それぞれ右クリックして zip ファイルを展開もしくは解凍してください。

android での準備

開発者向けオプションを有効にする

以下の手順で有効にします。*4

  1. 設定アプリを開く
  2. 設定画面トップにある検索バーで「ビルド」もしくは「Build」を検索する
  3. 「ビルド番号」もしくは「Build number」が出てくるのでタップし、当該ページに入る
  4. 「ビルド番号」もしくは「Build number」の項目を7回タップする

USB デバッグを有効にする

  1. 設定アプリを開く
  2. 設定画面トップにある検索バーで「USBデバッグ」もしくは「USB debugging」を検索する
  3. 「USBデバッグ」もしくは「USB debugging」が出てくるのでタップし、当該ページに入る
  4. 「USBデバッグ」もしくは「USB debugging」の項目を有効にする
  5. ワイヤレスで接続したい場合も、スマホ側の設定のワイヤレスデバッグは無効で大丈夫です

ここまでできたらあと少しです。

画面、音声ミラーリングの準備

android 端末と PC を USB ケーブルで接続します。
このとき、ファイル転送に使用するかどうかのダイアログが出てきますが、これはどちらでもいいです。
接続するたびに聞いてきます。

ファイル転送はどっちでもいい

次に、android 端末の方で「USBデバッグを許可しますか?」というダイアログが出てきます。
こちらは「許可」を押してください。

許可する

接続している PC が自分しか使わない等で信頼できるのであれば、「このパソコンからのUSBデバッグを常に許可する」にチェックを入れてから許可すると、「このパソコン」に接続したときはダイアログが出てこなくなります。

USB デバッグのダイアログが出てこない場合は以下を確認してみてください
- いちど scrcpy の実行ファイルを起動したり scrsndcpy.exe の Screen Sound Copy を押してみる
  (ダイアログが出てくる場合があります)
- 1つ上に戻って USB デバッグの設定を確認し、ケーブルを挿し直す
- データ転送に対応したケーブルを使う
  (データ転送に非対応のケーブルではできません)

画面・音声のミラーリング

「scrsndcpy.exe」 を起動します。
いったん『Config』を開きましょう。
端末の解像度と同じサイズのウィンドウが出てくるので、『最大サイズ』の数字を PC の画面に収まる値にします。

  • 何も考えないで1920もしくは720に設定しておけば丸く収まります

  • 基本的に縦画面のアプリは縦、横画面のアプリは横のサイズ、つまり長い方がこの値になるよう調整されたウィンドウが出てきます。

  • マウスで画面を操作したい場合、使っているディスプレイの縦もしくは横の解像度より小さい値を設定するとウィンドウが画面外にはみ出さずにすみます。

このへんの数字は「0」は「自動」や「デフォルト」を意味する場合が多いです。
端末を直接操作する場合は『デバイスの画面をOFF』のチェックを外します。

  • PC に出てきたウィンドウで端末を操作することもできます。

音ゲーをやる場合は『デバイスの音声をミュート』のチェックを外します。
 ※v1.2 では『デバイスの音声をミュート』の設定情報のみ読み込まれないため、起動するたびに設定する必要があります
 ※もしくは端末のボリューム + ボタンを押してもミュートが解除されます

Config のデフォルト設定

設定が終わったら『Device list』で自分の端末っぽいやつを選びます (端末のシリアル番号が表示されていると思います)。
スマホのロックを解除してから『Screen Sound Copy』をクリックします。
すると、ミラーリングされたウィンドウが表示されます。

ウィンドウ位置の調整

おそらく左上にはみ出して表示されるので、その場合はタスクバーの「My device」のダイアログを右クリックして「移動(M)」を選び、矢印キーでウィンドウを移動してください。
矢印キーを押したあとはマウスの移動でウィンドウがついてきて、クリックで場所を決定できます。

アプリアイコンにカーソルを合わせるとダイアログが出るので、それを右クリックする
ウィンドウ位置を動かしたら srcsndcpy の 『Streaming...』ボタンを Ctrl キーを押しながらクリックしてください。
ミラーリング終了と同時にウィンドウの位置が保存されて、次回からその位置に出てくるようになります。
ミラーリングが完全に終了するには少し時間がかかるので、少し待ってから再びミラーリングを開始してください。
20秒くらい待てば大丈夫だと思います。うまくいかなかったら scrsndcpy を再起動してください。

使い方・トラブルシューティング

「scrsndcpy.exe」 を起動します。
『Device list』で自分の端末っぽいやつを選びます (端末のシリアル番号が表示されていると思います)。
スマホのロックを解除してから『Screen Sound Copy』をクリックすると、ミラーリングが開始します。

音声のミラーリングAndroid 10 以上のみ対応です。
『Screen Sound Copy』をクリックした直後にスマホの画面に出てくる「sndcpy」のダイアログは自動で選択されるので触らないでください
それ以外のタイミングで出てきたり、いつまでも選択されないで残っている場合はキャンセルをタップしてください。
ただし、以下の説明の場合だけ例外です。
画面は出たけど音声が出ない場合、『manual sndcpy』をクリックし、ここで出てくる「sndcpy」のダイアログは『Start now』や『今すぐ開始』を自分でタップしたあと、PCで出てきたダイアログで『OK』をクリックしてください。
画面すら出て来ない場合スマホをいったん再起動してケーブルを挿し直し、タスクマネージャーに残っている「scrsndcpy Module」「adb.exe」を終了させてから「scrsndcpy.exe」を起動してみるとうまくいく場合があります。
うまくいかなかったらわかんない
『Device list』に端末が出ない場合、以下の2つを確認してください。

ケーブルが通信対応かどうかは、いったん USB デバッグを無効にして接続したとき、 PC に認識されるかどうかで判別できます。
外付けドライブ的に表示されたり、デバイスマネージャーのリストに表示されたりすれば認識されています。

LinuxmacOS の場合

画面のミラーリング

許可が済んだら、「scrcpy.exe」を起動します。
すると画面がミラーリングされたウィンドウが表示されます。OBS のゲームキャプチャなどでこのウィンドウを取り込みましょう。
ミラーリングの解像度を変更したい場合は後述の「トラブルシューティング」の「画面が出ない」を参考にしてください。 ミラーリングをやめたいときはこのウィンドウを閉じれば大丈夫です。

シンプルなウィンドウが出てくる

音声のミラーリング

先程ダウンロードしたファイル内の「sndcpy.bat」を起動します。

sndcpy.bat

こちらではコマンドプロンプトのウィンドウのみ表示されます。
sndcpyはこのウィンドウだけ表示される

sndcpy の場合、このウィンドウを閉じても音声のミラーリングは止まりません
Readme を読んだところ、ケーブルを抜くか、android 端末の通知センターで音声のミラーリングを止めてとのことです。*5
ただし、この方法ではプロセスが残る場合があるため、Ctrl+Shift+Esc でタスク マネージャーを開き、VLC media playerを終了させましょう。
タスク マネージャーで終了させる

トラブルシューティング (Linux, macOS)

ミラーリングした画面とミラーリングした音のズレが大きい

別々のソフトなので、どうしても微妙にズレます。
あまりにひどい場合は「sndcpy.bat」を何度か起動しなおすと改善する場合があります

音量調節ができない

ミラーリングした音声の音量は、PC 側の音量メニューなどで VLC の音量を変えて調整してください
Windows では EarTrumpet をインストールしておくと個別の音量調節が簡単にできて便利です。
www.microsoft.com

画面が出ない①

PC のディスプレイよりも android 端末の解像度が大きい場合にウィンドウが出ない場合があるみたいです。
その場合は以下を参考にコマンドラインでの起動を試してみてください。

  1. 「scrcpy.exe」と同じフォルダに新しくテキストファイルを作成する
  2. テキストファイルに scrcpy -m 800 とだけ入力して保存する
      (800 の部分はミラーリング時の (たぶん) 長辺の解像度なので、PC のディスプレイに合わせて数字を調整してみてください)
  3. テキストファイルの拡張子を .txt から .bat に変更する
      (拡張子を表示する設定にしておいてください)
  4. この bat ファイルをダブルクリックして scrcpy を起動する

画面が出ない②

端末が複数接続されていると上記方法ではうまくいかないので1台だけ接続してください。
もしくは以下の「上級者編」を参考に adb をインストールし、その下の「ちゅうい」を参考にコマンドを打ち込んで起動してください。

                                             

ワイヤレス編

Windows は scrsndcpy のおかげで簡単にできるようになりましたが、Linux, macOS はコマンドを打ち込むので上級者編です。

ワイヤレスのメリット

  • ケーブルが邪魔にならない
  • Type-C 端子が空く (イヤホンが使えるようになる)

ワイヤレスのデメリット

  • 有線よりは若干パフォーマンスが落ちる
  • 常にワイヤレスで映像をやり取りしているので、端末が熱くなってバッテリーの寿命に影響がある
  • 毎回コマンド (IPアドレス) 打つのがめんどくさい (Linux, macOS の場合)

ワイヤレスでミラーリングする (Windows の場合)

  1. 「scrsndcpy」の『Config』を開く
  2. 『デバイスWi-Fi経由での接続を行えるようにする』のチェックを入れる
  3. android 端末と PC をケーブルで一旦繋ぐ
  4. 『Device list』に『192.168.0.x:5555 (端末名)』が増えるので、これを選ぶ
  5. 『Screen Sound Copy』をクリック
  6. ケーブルを外す

ワイヤレスでミラーリングする (Linux, macOS の場合)

こちらは上級者編なので解説が若干簡易です。

追加で必要なもの

  • adb 環境
      (PC へインストールする必要があります)
  • Wi-Fi ルーター
      (PC と android 端末が同じルーターへ接続している必要があります。PC 側は有線の方がいいです。
       また、場合によってはファイアウォールの設定が必要かもしれません)

    adb のインストール

    「adb インストール」などで検索するといっぱい出てくるのでそちらを参考にインストールしてください。
    めんどくさいのでこの記事が長くなってしまうので解説しません。
    PowerShellコマンドプロンプトadb version と入力して Android Debug Bridge version x.x.xx とか表示される状態なら大丈夫です。
    Path を通しておくのを忘れないようにしましょう

ワイヤレスデバッグで接続する

公式のガイドもわかりやすいのでこれも参考にしてください。
developer.android.com

Android 11 以上の場合

  1. 開発者向けオプション内の「ワイヤレスデバッグ」を有効にし、ネットワークでのデバッグを許可する
  2. 同じメニュー内の「ペア設定コードによるデバイスのペア設定」をタップして 6桁のコードとIP アドレス:ポートをメモする
  3. scrcpy.exe」の入っているフォルダ内で右クリックし、「Windows ターミナル」もしくは「PowerShell」もしくは「コマンドプロンプト」を開く
      (古い Windows では Shift を押しながら右クリックすることでメニュー内にこのオプションが出現します)
  4. adb pair [2でメモした IP アドレス:ポート] と入力し、その後6桁のコードを入力する
      (いちどこれをおこなうと次からはこの4の作業は省略できます)
  5. 「ワイヤレスデバッグ」メニュー内に表示されている IP アドレス:ポート (ポート番号がさっきとは違う) をメモする
  6. adb connect [5でメモした IP アドレス:ポート] と入力し、android 端末と接続する

Android 10 以下の場合

  1. android 端末とUSBで接続し、USB デバッグを有効にする
  2. scrcpy.exe」の入っているフォルダ内で右クリックし、「Windows ターミナル」もしくは「PowerShell」もしくは「コマンドプロンプト」を開く
      (古い Windows では Shift を押しながら右クリックすることでメニュー内にこのオプションが出現します)
  3. adb tcpip 5555 と入力する   (これ以降は USB を外しても大丈夫です)
  4. android 端末の設定内にある IP アドレスを確認する   (端末情報内にあると思いますが、設定内で「IP」を検索しても出てきます)
  5. 2で開いたターミナルに adb connect [4の IP アドレス]:5555 と入力し、android 端末と接続する

scrcpy を起動する

そのまま scrcpy.exe を起動すると画面の送受信で Wi-Fi の帯域を圧迫してしまうため、コマンドラインビットレートを下げて起動します。
「ワイヤレスデバッグで接続する」の3または2で起動したターミナルで、scrcpy -b 4M -m 800もしくは .\scrcpy -b 4M -m 800と入力してscrcpy を起動します。
-b 4Mビットレートを 4Mbps に指定しています。デフォルトは 8Mbps です。
-m 800ミラーリングの解像度の (たぶん) 長辺を 800px に指定しています。デフォルトは端末の解像度と同じです。
数字をいろいろ変えてみて丁度いい感じのところを探してみてください。
ちなみにワイヤレスでミラーリング中は端末の通信速度が落ちるので、ゲーム中のダウンロード時間などが伸びます。ビットレート設定は画質の他にここに影響があります。
終了はウィンドウを閉じるだけです。

sndcpy を起動する

こちらはいつもどおり「sndcpy.bat」で起動してください。 終了もいつもどおりです。

USBデバッグを切断する

ターミナルに adb disconnect と入力すると切断できます。
もしくは android 端末の通知センターから切断できます。

ワイヤレスデバッグのペアリングから一連のコマンド操作を 「Android 11 以上 」でおこなった「PowerShell」の画面はこんな感じです。

PowerShell の画面

ちゅうい

複数の端末が接続されていると ( adb devices で複数出てくる場合) シリアルで指定する必要があります。
scrcpy、sndcpy のページで「serial」を検索するとそれっぽい箇所が出てきます。
もしくは adb disconnect で全て切断したあと、1台だけ接続してください。

おわり

以上です。
scrcpy のドキュメントを読むとかなり豊富なオプションが用意されていて、いろいろできそうです。
たとえば --rotation 0 --lock-video-orientation とつけて起動すると、scrcpyを起動したときの端末の画面の向きでミラーリングのウィンドウの向きを固定することができます。
OBS で画面を取り込んだ際、端末の画面の向きがコロコロかわると OBS 内の画面レイアウトが崩れる場合があるので、向きを固定することで防ぐことができます。
--turn-screen-off --stay-awake とつけて起動すると、端末の画面はオフにしたままミラーリングの方で操作するという、変わったことができます。
--record [ファイル名].mp4 で画面録画を直接ファイルに出力することもできます。音はないけど。

おまけ

OBS のバウンディングボックス

OBS でキャプチャして配信している方向けに、縦向きと横向きが急に切り替わってもレイアウトが大きく崩れない設定を紹介します。
まず、配信で使いたい向きでレイアウトを設定してください。
次に、画面をキャプチャしているソースを右クリックして、『変換>変換の編集』を選びます。
以下の画像を参考に『バウンディングボックスの種類』『バウンディングボックスのサイズ』を設定してください。

『境界の内側に合わせる』を選び、『大きさ』と同じ値を設定する
こう設定することで、バウンディングボックスが外枠となり、画面のサイズが急に変わっても引き伸ばしされずにボックスの内側に収まってくれるようになります。

設定するとボックスをはみ出ることがない

設定しない場合ははみ出る

ボックス内のどこに寄るかは『バウンディングボックス内の配置』の設定で変わります。

配信テスト

srcsndcpy を使ったワイヤレスのミラーリングで配信してみました。
終盤で接続してる白いケーブルはコンセントに繋いだ充電用のケーブルです。

5時間以上配信しましたが、ミラーリングが落ちたのはアプリ切り替えでホーム画面に戻ったときのみでした。
設定はこんな感じです。

サイズを1920にした以外はほぼデフォルト

遅延した音声を聞きたくない (でもフォロー通知には気づきたい)

読み上げやフォロー通知音などを利用していて、さらに音ゲーなどをやっている場合、遅延のあるミラーリングの音ではなく、端末の音を直接聞きたくなります。
しかし、ミラーリングした scrsndcpy の音声をミュートすると配信に乗らないし、PC のイヤホンを外すと読み上げなどの音が聞こえなくなってしまいます
このジレンマを解決する、少しトリッキーな設定を紹介します。

  1. Windows 11 の設定アプリの 『システム > サウンド > 音量ミキサー』で、scrsndcpy の出力デバイス仮想オーディオデバイスなどの使っていないデバイスに設定する
     ミラーリングを開始して音が出ている状態じゃないと一覧に scrsndcpy が出ないかも
     ※タスクバーのボリュームアイコンを右クリックでも呼び出せます
     Windows 10 の音量ミキサーでもたぶん同様の設定ができます
  2. アプリケーションごとに音声をキャプチャしてくれる OBS のプラグインを使って、 scrsndcpy の音声をキャプチャする

普段設定している、デスクトップの音声を配信に乗せる設定はそのままで大丈夫です。
1 をすることで、スピーカーなどから音は出ないが、アプリはミュートになっていない状態になるので、 OBS でキャプチャしたときに音声が配信に乗ります。
自分の場合は特に使っていない「Steam Streaming Speakers」に設定しています。 Steam のゲームをリモートで遊ぶときに使われる仮想デバイスのようです。
2 をすることで、どっかに飛ばされてしまった scrsndcpy の音声を直接キャプチャして配信に乗せることができます。

scrsndcpy だけ分離してキャプチャすることで、自分はミラーリングの音声だけ聞こえない状況にすることができます。
図にするとこんな感じです。

音声出力の流れ

マイクを使っていてスピーカーから音を出したくない場合は物理ミキサーを使ったり、ダイソーのイヤホンスプリッターを逆接続したり *6 して、PC の音声と端末の音声を1つのイヤホンやヘッドホンにまとめてください。

*1:android 単体で配信したりできる機種やアプリはあるが、PC に取り込んでこっちで配信したほうがレイアウトなどの自由度がずっと高い

*2:USB で接続するだけで画面出力してくれると思っている人は一定数いる

*3:いわゆる USB3.0 には公式の呼び方が複数あって、詳しくはここを参照 https://pc.watch.impress.co.jp/docs/topic/feature/1339890.html

*4:参考: https://developer.android.com/studio/debug/dev-options?hl=ja

*5:Windows 以外では Ctrl+C で止まる模様

*6:オス-オスケーブル2本とメス-メスのアダプタ1つが必要