■だいぶ前からオーディオサーバーの出力をリモートで聴けないかと試行錯誤していて、Bluetoothとかいろいろ試していたのだけどこれといった決定打とはならず。要するにLinuxサーバーをジュークボックスとして、サーバー側で勝手に再生されていて、そのオーディオ出力をアドホックに、ロケーションフリーで聴くことができるようにしたい。そのためクライアントPCで再生しては意味がなく、NASにmp3ファイルを置いてそれを再生する、というのとは違う。
Bluetoothが決定打にならなかったのは送信距離がネックになったことと、リンクが良く切れることが問題だった。あんまり使い勝手が良くない。それでしばらく放っておいたのだけど、先日サーバーOSを入れ替えたこともあって、もう一度調べてみることにした。とりあえず目標のハードルを少し下げて、サーバーで出力されているオーディオをPC側でもモニタできるようしたい。
PulseAudioというのが一つの方法になりそうだったのだけど、最近のバージョンになったからか、それともPC側がWindows8だからか、これがうまくいかない。Windows8からLinuxに向けての接続はできているようなのだけど、逆ができない。LinuxサーバーをPulseAudioのクライアントとし、Windows8側をPulseAudioサーバーにしたかったのだけど、認証が通らない。ファイアーウォールのためではなさそうなのだけど、では何なのかというとわからず。
とPulseAudioについてはあきらめて、ちょっと古いicecastなど使ってみたけど、肝心のLinuxサーバー上でのPulseAudio出力をフェッチしてicecastに流す方法がわからない。ただ、PulseAudio出力の変換方法について調べていくうち、soxユーティリティの存在を知った。
soxはオーディオフォーマットを変換するツールで、ファイル入出力の代わりに標準入出力が使えたらWebのCGI経由で任意のタイミングでPC側で聴くことができるだろう。
まず見つかったのはPulseAudioで録音したファイルをWAVに変換するコードだった。
エッセンスを抜き出すとこうなる。
parec | sox -t raw -c 2 -r 44k -b 16 -e signed-integer -t wav - converted.wav
入力に標準入力が使えるなら、出力も標準出力にしてくれたらいいわけで、あれこれ調べつつ試行錯誤していると次のように書けることがわかった。
sox -t raw -c 2 -r 44k -b 16 -e signed-integer "|parec " -t wav -
parecのヘッダなしPCM出力をWAVに変換して標準出力してくれるので、あとはHTTPヘッダを付けるようなシェルスクリプトにまとまればCGIになる。バッファリングが無いのでネットワーク帯域の変動には弱いのだけど、Linuxサーバー側のオーディオ出力をモニタできるようになった。理想形にはほど遠いのだけど。
NUCにLinuxを入れて、PalseAudio(TCP)-Bluetoothブリッジをリビングに置くといいのかな、とか思っている。消費電力が気になるところ。