「aptで入れたscrcpyに音声のオプションが見当たらない」「adb devices が no permissions になって先に進めない」「画面は映るのに音だけ出ない」——LinuxでAndroidの画面をPCに映そうとして、この3つのどれかで止まった人は多いはずです。
scrcpyは映像も音声もPC側に出せるツールですが、Linuxでは「入れ方」「つなぎ方」「音の行き先」の3か所にそれぞれ別の落とし穴があります。本記事では、Ubuntu 24.04で実際に踏んだ順に、切り分けのコマンドと直し方をまとめます。
・Ubuntu 24.04 の apt の scrcpy は 1.25 で音声非対応。公式のビルド済みバイナリ(2.x以降)を
~/opt に展開して使う ・USB の
no permissions は udev ルール(sudo)が要る。Android 11 以上ならワイヤレスデバッグにすれば USB ごと不要 ・「映るのに鳴らない」の多くは PC 側の既定出力(Bluetoothスピーカー等)に流れているだけ。
wpctl set-default で出力先を変えて scrcpy を再起動 ・無音なのか行き先違いなのかは推測せず、
pw-record で数秒録音して実測する 目次を開く
詰まり① apt の scrcpy は音声に対応していない
scrcpy の音声転送は scrcpy 2.0 以降・Android 11 以上が条件です。ところが Ubuntu 24.04 の apt で入る候補は 1.25 で、--audio-source などの音声オプション自体が存在しません。まず手元の版を確認します。
scrcpy --version
apt policy scrcpy # 候補が 1.25 なら apt 版は諦める 直し方: 公式のビルド済みバイナリを sudo なしで置く
GitHub の scrcpy リリースページにある scrcpy-linux-x86_64-vX.Y.tar.gz(X.Y は最新版に読み替え)は adb 同梱・自己完結なので、ホーム配下に展開してパスを通すだけで動きます。
# apt 版を入れていたら先に外す(混在すると古い方が呼ばれる)
sudo apt remove scrcpy
mkdir -p ~/opt/scrcpy ~/.local/bin
tar -xzf scrcpy-linux-x86_64-vX.Y.tar.gz -C ~/opt/scrcpy --strip-components=1
ln -sf ~/opt/scrcpy/scrcpy ~/.local/bin/scrcpy
ln -sf ~/opt/scrcpy/adb ~/.local/bin/adb
scrcpy --version # 2.x 以降になっていれば OK ~/.local/bin は Ubuntu では既定でパスに含まれます(存在しなかった場合はログインし直すと反映されます)。
詰まり② adb devices が no permissions — USB をやめてワイヤレスにする
USB 接続で adb devices が no permissions になるのは、udev ルールが無いためです。ルールを置くには sudo が要ります(方法は FAQ 参照)。一方、Android 11 以上のワイヤレスデバッグなら最初から USB も udev も不要です。
手順: ペアリングから接続まで
端末側で「設定 → 開発者向けオプション → ワイヤレスデバッグ → ペア設定コードによるデバイスのペア設定」を開いたままにして、PC で次を実行します。
# 端末が広告している IP とポートを自動で拾う(画面の数字を読み上げてもらう必要がない)
adb mdns services
# _adb-tls-pairing._tcp → ペアリング用の IP:ポート
# _adb-tls-connect._tcp → 接続用の IP:ポート(ペアリング用とは別ポート)
adb pair <IP:ペアリング用ポート> <6桁のコード>
adb connect <IP:接続用ポート>
adb devices # device と出れば OK
scrcpy more than one device/emulator と言われたら
mDNS で既に自動接続されているところへ手動で adb connect すると、同じ端末が2エントリになり scrcpy が起動できません。手動でつないだ方を切って1本にします。
adb devices
adb disconnect <IP:接続用ポート> # 手動で connect した方を切る
scrcpy 以後は端末の IP が変わっても mDNS で見つかるため、scrcpy と打つだけでつながります。
詰まり③ 映るのに音が出ない — 犯人は PC の既定出力
映像は出て、端末側でも再生しているのに PC から音がしない。このとき端末や scrcpy を疑いがちですが、実際の原因は PC 側の既定出力が別の機器(自動で既定になった Bluetooth スピーカーなど)になっていたことでした。
scrcpy の音声ストリームは PulseAudio / PipeWire の「既定シンク」に乗り、アプリ単位のルーティングが効きません。PULSE_SINK= も SDL_AUDIO_DRIVER=pulseaudio も pw-metadata <id> target.object も、すべて無視されて既定シンクへ流れ続けます。
まず「無音」か「行き先違い」かを実測する
# 既定出力(Sinks の * 印)と各 sink の id を見る
wpctl status
# 疑わしい sink を指定して数秒録音し、Ctrl+C で止める
pw-record --target <sink id> out.wav
# 音が来ているか(mean/max volume が -90dB 付近なら無音)
ffmpeg -i out.wav -af volumedetect -f null - 2>&1 | grep -E 'mean_volume|max_volume' ピークが出ていれば「音は来ている=行き先の問題」と確定できます。端末側が本当に再生しているかは次で見られます。
adb shell dumpsys audio | grep "state:started" 直し方: 既定出力を切り替えて scrcpy を再起動
wpctl status # 目的の sink の id を確認
wpctl set-default <目的の sink id>
scrcpy # 再起動しないと切り替わらない wpctl にはストリームを移動するコマンドが無く、pactl は Ubuntu 24.04 に標準では入っていません。「既定を変えてから起動し直す」が最短です。
端末のスピーカーから鳴らなくなるのは既定の動き
既定の --audio-source=output は端末の音を PC 側へ横取りするため、ミラーリング中は端末スピーカーから鳴りません。両方で鳴らしたい場合は、手元の版の scrcpy --help で音声関連のオプション(--audio-dup など)を確認してください。
切り分けの順番
| 症状 | 見るところ | コマンド | |
|---|---|---|---|
音声オプションが無い/--audio-source が unknown | scrcpy の版 | scrcpy --version が 1.x なら詰まり① | |
adb devices が no permissions | USB の udev | ワイヤレスに切り替え(詰まり②)または udev ルール | |
more than one device/emulator | adb の接続エントリ | adb devices → 重複を adb disconnect | |
| 映るのに鳴らない | PC の既定出力 | wpctl status → pw-record で実測 → wpctl set-default | |
| PC でも端末でも鳴らない | 端末側の再生状態 | `adb shell dumpsys audio \ | grep "state:started"` |
まとめ
- Linux の scrcpy で音を出すなら、apt 版ではなく公式のビルド済みバイナリを
~/optに置く(sudo 不要) - 接続は Android 11 以上のワイヤレスデバッグにすると udev ルールも USB も要らない。
adb mdns servicesでポートを拾い、重複エントリはadb disconnectで1本にする - 「映るのに鳴らない」は端末でも scrcpy でもなく PC の既定出力を疑う。
pw-recordで録って実測し、wpctl set-defaultで切り替えてから scrcpy を再起動する
よくある質問(FAQ)
apt 版の scrcpy のまま音声を出す方法はありませんか?
ありません。音声転送は scrcpy 2.0 で入った機能で、1.25 には対応するコードがそもそも含まれていません。公式バイナリへの入れ替えが唯一の解決です。
USB で接続したい場合はどうすればいいですか?
android-sdk-platform-tools-common パッケージを入れると udev ルールが一緒に配置されます(sudo が必要)。入れたあとは端末を抜き差しし、adb devices が device になれば scrcpy はそのまま使えます。
Windows や macOS でも同じ問題が起きますか?
詰まり①は Linux のディストリビューション配布版が古いことが原因なので、公式 zip(Windows)や Homebrew(macOS)で新しい版が入る環境では起きにくいです。詰まり③は PipeWire / PulseAudio の既定シンクに固定される Linux 固有の挙動です。
音は出るようになったが、端末側のスピーカーが黙ってしまいました
--audio-source=output の既定の動きです。ミラーリングを止めれば端末側に戻ります。両方で鳴らす必要がある場合は、手元の版の scrcpy --help で音声の複製に関するオプションを確認してください。
