以下の記事で「AudioRelay」というアプリを知りました.
ちょっと飲み物を取ってくるとかいうときなどに便利そう.
しかしこれはWindowsからAndroidへ転送するもので他の環境では動作しません.Linuxでも動作するものを探してみました.
「SoundWire」
SoundWireはWindow若しくはLinux x64_64(64bit)/x86(32bit),Raspberry Pi OSからAndroidへオーディオを転送してくれるようです.
バイナリが配布されているので対応するそれを入手して展開,実行してAndroidアプリから接続すればオーディオが転送されます.デスクトップファイルやアイコンも同梱されているので必要に応じて登録すると便利そうです.
$ tar tvf SoundWire_Server_linux64.tar.gz (1)
drwxrwxrwx Georgie/None 0 2020-01-26 21:22 SoundWireServer/
-rwxrwxrwx Georgie/None 2913 2020-01-16 09:00 SoundWireServer/INSTALL.txt
-rwxrwxrwx Georgie/None 1393 2020-01-16 08:46 SoundWireServer/license.txt
-rwxrwxrwx Georgie/None 2235 2014-09-16 09:08 SoundWireServer/opus_license.txt
-rwxrwxrwx Georgie/None 1583 2014-09-16 09:09 SoundWireServer/readerwriterqueue_license.txt
-rwxrwxrwx Georgie/None 6915 2020-01-26 21:22 SoundWireServer/README.txt
-rwxrwxrwx Georgie/None 448 2019-12-31 11:00 SoundWireServer/SoundWire-Server.desktop
-rwxrwxrwx Georgie/None 1611672 2020-01-16 11:55 SoundWireServer/SoundWireServer
-rwxrwxrwx Georgie/None 237351 2012-11-22 17:28 SoundWireServer/sw-icon.xpm
$ tar xf SoundWire_Server_linux64.tar.gz (2)
$ clamscan SoundWireServer/SoundWireServer (3)
$ ha512sum SoundWireServer/SoundWireServer
a0c1da0afad9e94aef82e19b2555ccf33494ec56fdbd6193a838beae31cec58ca75cae1949f520db84c6793bab13c9c3283b519416bebb1c54bbd66b5c489676 SoundWireServer/SoundWireServer
$ SoundWireServer/SoundWireServer (4)
- アーカイブの確認
- アーカイブの展開
- 念の為手動でもウィルス確認
- 実行
ソースは公開されていないようです.
ファイアウォールを利用している場合は,UDP:59010, 59011 を開放する必要があるようです.(起動オプションや環境変数でカスタマイズ可能)
その他, -nogui
オプションでX無しでも動作します.
「WifiAudio」
「WifiAudio」はWindows若しくはLinux x86_64(64bit)からAndroidへオーディオを転送してくれるようです.
PC側は以下のページでバイナリが配布されているのですが,ダウンロードするにはフォーラムに登録が必要のようです.登録には氏名,メールアドレス,生年月日などを求められます.
$ clamscan ./wifiaudio_linux (1)
$ sha512sum ./wifiaudio_linux
6c78f47066ad550b988468c74e9bd56e099393a61a11ffffeda31fc181c60cbd5209763e80da9000d6453fef5cc829b9329b26d46993cc3f00c0bb76ffc81864 ./wifiaudio_linux
$ chmod u+x ./wifiaudio_linux (2)
$ ./wifiaudio_linux (3)
- 念の為手動でもウィルス確認
- 実行権付与
- 実行
$ lsof -i | grep wifiaudio
wifiaudio 1818239 matoken 12u IPv4 15191466 0t0 UDP *:32000
利用ポートを確認すると UDP:32000 のようなのでファイアウォールを利用している場合は開放しておきます.
「ffmpegとVLC」
クローズドソースのものしか見当たらないなということで例によってffmpegで試してみます.
アプリケーションの音声をキャプチャしてmp3形式でスマートフォンのipアドレスに配信します.
$ pactl list short sources (1)
0 alsa_output.pci-0000_00_1b.0.analog-stereo.monitor module-alsa-card.c s16le 2ch 44100Hz RUNNING
1 alsa_input.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 48000Hz RUNNING
2 alsa_input.pci-0000_00_1b.0.analog-stereo.echo-cancel module-echo-cancel.c float32le 1ch 32000Hz RUNNING
3 alsa_output.pci-0000_00_1b.0.analog-stereo.echo-cancel.monitor module-echo-cancel.c float32le 1ch 32000Hz RUNNING
4 alsa_input.hw_Loopback_1_0 module-alsa-source.c s16le 1ch 16000Hz RUNNING
$ ffmpeg -f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor -ac 2 -acodec libmp3lame -f rtp rtp://10.42.0.90:1234/ (2)
- PulseAudioのデバイスを確認
- ffmpegでAndroidのIPに対してmp3形式で配信
この状態でVLC等で rtp://@:1234
を再生するとLinuxDesktopの音が流れてきます.
ffmpegのオプションについてはこのあたりを.
AndroidでmDNSが使えればいいのですが,使えなさそうなのでIPアドレスを確認するのがちょっとめんどうですね.固定IPにしたりマルチキャスト配信してしまってもいいかもしれません.
とりあえずはarpでごまかしてみました.
#!/bin/bash
MONITOR=`pactl list short sources | grep analog-stereo.monitor | cut -f2 -d' '`
PHONE_MAC=18:d6:1c:00:00:00
PHONE_IP=`arp -i wlp3s0 | grep ${PHONE_MAC} | cut -f1 -d' '`
PORT=1234
ffmpeg -f pulse -i ${MONITOR} -acodec libmp3lame -ar 22050 -f rtp rtp://${PHONE_IP}:${PORT}/
「ffmpegとicecast2」
Wi-Fiの届く自宅内であればこれまでのものでいいですが,長丁場でご飯買いにコンビニまで行ってこようというような時には使えません.
外のサーバーに投げてストリーミングしてみます.今回はicecast2を利用しています.
$ ffmpeg -f pulse -i alsa_output.platform-snd_aloop.0.analog-stereo.monitor -loglevel 31 -stats -f adts -content_type audio/aac icecast://$USER:PASS@example.com:8000/stream
Androidでicecast2のurlを開くとLinuxデスクトップの音が聞こえてきます :)
ffmpegの部分をOBS StudioにするとGUIなのでとっつきやすいかもしれませんね.
帯域が気になる場合はビットレートを落とすといいと思います.このままだと128kbps程ですが, -ar 22050
として 64kbps, -ar 11025
をつけると32kbpsになります.
32kbpsはちょっと音が悪い感じなので,64kbps以上は欲しいかな?
icecast2などはこのあたりでも
ちなみに,VPSなどのサウンドカードのない計算機の場合以下のようにダミーデバイスを読み込むことで同じことが出来て便利です.
帯域が細かったりPCのスペックが足りないけど音声だけでも聞きたいといったときなどに使えます.
$ sudo modprobe -v snd-dummy
insmod /lib/modules/4.19.0-14-amd64/kernel/sound/drivers/snd-dummy.ko
終わりに
SoundWireとWifiAudioではLinuxではSoundWireの方がいいかなという感じです.しかしffmpeg+VLCでいいのではという感じも.
PC側の操作ですが,ボリュームは反映されず音量0でも配信されますが,ミュートすると聞こえなくなるので注意が必要です.
再生デバイスに迷った場合は pavucontrol
などで Recordicg
タブでプルダウンメニューからデバイスを順番に試していくといいと思います.音は出るけどノイズが多い場合はスピーカーからの音を拾っているマイクデバイスを選んで要る可能性があります.
そして現在自宅のWi-Fiは去年の台風時に壊れてNotePCをAPにしていて部屋を出ると電波が届かず実際は家の中ではどれも使えないという問題が.家を出て少し行くとmobile回線使えるんですけどね…….
環境
$ SoundWireServer/SoundWireServer -nogui
:
SoundWire Server v3.0
:
$ dpkg-query -W ffmpeg lsof
ffmpeg 7:4.3.1-8
lsof 4.93.2+dfsg-1.1
$ lsb_release -dr
Description: Debian GNU/Linux bullseye/sid
Release: unstable
$ uname -m
x86_64
- SoundWire (free)
- Version 3.0
- WiFiAudio
- Version 2.0
- VLC
- Version 3.3.4
- 本体
- Rakuten mini(C330)
- Android
- 9(セキュリティ アップデート:2020年12月5日)