アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

Linuxでscrcpyの音が出ない時の直し方(apt版・adb権限・出力先の3つの詰まり)

Featured image of the post

「aptで入れたscrcpyに音声のオプションが見当たらない」「adb devicesno permissions になって先に進めない」「画面は映るのに音だけ出ない」——LinuxでAndroidの画面をPCに映そうとして、この3つのどれかで止まった人は多いはずです。

scrcpyは映像も音声もPC側に出せるツールですが、Linuxでは「入れ方」「つなぎ方」「音の行き先」の3か所にそれぞれ別の落とし穴があります。本記事では、Ubuntu 24.04で実際に踏んだ順に、切り分けのコマンドと直し方をまとめます。

💡
30秒で要点
・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 devicesno 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=pulseaudiopw-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 devicesno permissions USB の udev ワイヤレスに切り替え(詰まり②)または udev ルール
more than one device/emulator adb の接続エントリ adb devices → 重複を adb disconnect
映るのに鳴らない PC の既定出力 wpctl statuspw-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 devicesdevice になれば scrcpy はそのまま使えます。

Windows や macOS でも同じ問題が起きますか?

詰まり①は Linux のディストリビューション配布版が古いことが原因なので、公式 zip(Windows)や Homebrew(macOS)で新しい版が入る環境では起きにくいです。詰まり③は PipeWire / PulseAudio の既定シンクに固定される Linux 固有の挙動です。

音は出るようになったが、端末側のスピーカーが黙ってしまいました

--audio-source=output の既定の動きです。ミラーリングを止めれば端末側に戻ります。両方で鳴らす必要がある場合は、手元の版の scrcpy --help で音声の複製に関するオプションを確認してください。

プログラミング学習でお悩みですか?

現役エンジニアがあなたの学習をマンツーマンでサポートします。

  • 学習の進め方がわからない
  • ポートフォリオの作り方を知りたい
  • 現場で使える技術を学びたい
まずは30分の無料相談

相談は完全無料・オンラインで気軽に

あなたを爆速で成長させるメンタリングプログラムはこちら

メンタープログラムバナー

学習・開発のお悩みは現役エンジニアに相談

メンタープログラムの詳細を見る

エンジニアの基礎学習ゲーム

プログラミング学習支援

無料相談はこちら