SVX日記
2016-09-04(Sun) ラズベリーパイ(pidora)でメディアサーバする、そして心地良い目覚めへ
ラズベリーパイで無線LANアクセスポイントを作り、ラズベリーパイで無線LANブリッジを作ったことにより、愛用のミニコンポ「DENONのRCD-N9」を正しく宅内LANに「有線」で接続することができた。こんな感じに。
このような構成にした動機は、RCD-N9の無線LAN接続機能が「どタコ」なことにある。無線経由でflac等を再生中、他の無線トラフィックが増えると、接続が切断され、音楽が切れるのだ。切れると、再接続まで時間がかかるし、曲の再生は最初からになってしまう。それが頻繁に発生する。
実に「音楽が途切れる」という事態に対しては、恐ろしく高いレベルの腹立たしさを感じさせられるものである。仮にも高品質な音楽の再生を謳う機器においては「極力避けるべき事態」ではないのか。無線LANは不安定だから仕方ない、などということは断じてない。TCPという仕組み上、再生が止まることはあっても切れることはあり得ない。実際、動画サイトで切れるなどという事態に遭遇したことはないはずだ。
ちょっとtcpdumpでパケットの様子を調べた限りでは、RCD-N9側のTCPスイートに問題があるようで、その点ではRCD-N9は疑うことのない超ド級のクッソプロダクトなのだが、それ以外の点は十分に及第点なので、その点はあきらめて、ラズベリーパイを噛ますことでフォローすることにしたのである。
具体的にはどうするかというと、上述の通りRCD-N9とラズベリーパイ間を有線LANで直結とし、通信の安定性の低い無線LANの通信をLinuxのNFS接続で保障してやるのである。つまりラズベリーパイ上にDLNAサーバを配置するのである。
server.itline.jp:/root # cat /etc/exports
/home/mediatomb 172.xx.xx.0/24(ro)
xxxpi.itline.jp: /root # yum install nfs-utils
xxxpi.itline.jp: /root # mkdir /mnt/mediatomb
xxxpi.itline.jp: /root # mount server:/home/mediatomb /mnt/mediatomb/
xxxpi.itline.jp: /root # cat /etc/fstab
server:/home/mrdiatomb /mnt/mediatomb nfs defaults 0 0
xxxpi.itline.jp: /root # yum install mediatomb
xxxpi.itline.jp: /root # cd /etc
xxxpi.itline.jp: /etc # diff mediatomb.conf.org mediatomb.conf
< MT_INTERFACE="NOT_SET"
> MT_INTERFACE="br0"
xxxpi.itline.jp: /etc # cd mediatomb
xxxpi.itline.jp: /etc/mediatomb # diff config.xml.org config.xml
< <name>MediaTomb</name>
> <name>MediaTomb - xxxpi</name>
xxxpi.itline.jp: /etc/mediatomb # systemctl enable mediatomb
xxxpi.itline.jp: /etc/mediatomb # systemctl start mediatomb
この後http://xxxpi:50500/にWebアクセスして、/mnt/mediatombのディレクトリを登録してやれば、RCD-N9のMUSIC SERVER機能で、flacファイル等を選択、曲を再生できるようになる。これにて、ハイパーミッドナイトサーバ(オイラは寝しなに音楽を聴くので)の完成である。
オイラは起き抜けにも音楽を聴くのだが、それにRCD-N9のアラーム機能を使っている。開始時刻を6:00に設定、入力ソースにはCDを選択、寝る前に好みのCDをトレイにセットする。そして6:40頃に気分よく起き出すのだ。
仕方ないといえば、仕方ないが、そこをサッサとあきらめたりしないのがエンジニアである。インターネットラジオ機能で、自分専用に曲をストリーミング配信することで、上記をまとめて解決してしまうのである。おそらく、インターネットラジオ配信において、最短配信距離記録ギネス更新(直線距離10cm以下)という偉業達成の瞬間ではないかと思う。
icecastは、フロントエンドサービスを行うアプリ。ウェブサーバとして振る舞い、インターネットラジオ聴取クライアントに曲を配信する。が、自らは曲を扱わず、インターネットラジオ配信クライアント(?)から曲の提供を受ける。
icesは、インターネットラジオ配信クライアント。icecastにアクセスし、icecastが配信する曲を提供する。んが、icesはバージョン2からOggVorbis形式の配信しか対応していないようで、mp3形式では配信できない。古いicesはできるようだが、そんなものを使うべきではないだろう。
上記はどれも、Icecastスイートとしてxiphという開発コミュニティで扱っているようで、ここはOggVorbisやflacの開発主体でもあるようだ。
配信形式によって、アプリの使い分けが必要なことや、配信形式が特定の形式に限定されている意味がよくわからんが、なにせflacでの配信はできず、RCD-N9も対応していないので、mp3形式での配信が妥協点である。
xxxpi.itline.jp: /root # yum install icecast ezstream
xxxpi.itline.jp: /root # cd /etc
xxxpi.itline.jp: /etc # diff icecast.xml.org icecast.xml
< <bind-address>127.0.0.1</bind-address>
> <bind-address>0.0.0.0</bind-address>
xxxpi.itline.jp: /etc # systemctl start icecast
xxxpi.itline.jp: /etc # cp /usr/share/doc/ezstream/examples/ezstream_mp3.xml ezstream.xml
xxxpi.itline.jp: /etc # find /mnt/mediatomb/YUMI_54_WITH3 -name "*.mp3" > /usr/share/icecast/playlist.m3u
xxxpi.itline.jp: /etc # diff ezstream.xml.org ezstream.xml
< <filename>playlist.m3u</filename>
> <filename>/usr/share/icecast/playlist.m3u</filename>
xxxpi.itline.jp: /etc # ezstream -c /etc/ezstream.xml
mp3ファイルを羅列したプレイリストファイルを生成し、ezstreamの設定ファイルに指定、ezstreamを起動する。この状態でhttp://xxxpi:8000/にアクセスすると演奏中の状態が確認できる。また、インターネットラジオ聴取クライアントにhttp://xxxpi:8000/streamを指定すれば、とりあえず音楽を聴くことができる。
んが、これでは不満。オイラのライブラリはflacで構築しているのだ。百歩譲ってmp3配信は許容するが、ライブラリをmp3化するのは許容できない。二重に持つのもイヤだ。そこでezstreamの「リ・エンコーディング」機能を使う。
xxxpi.itline.jp: /etc # cp /usr/share/doc/ezstream/examples/ezstream_reencode_mp3.xml ezstream.xml
xxxpi.itline.jp: /etc # find /mnt/mediatomb/YUMI_54_WITH3 -name "*.flac" > /usr/share/icecast/playlist.flac.txt
xxxpi.itline.jp: /etc # diff ezstream.xml.org ezstream.xml
< <filename>playlist.pl</filename>
> <filename>/usr/share/icecast/playlist.flac.txt</filename>
< <playlist_program>1</playlist_program>
> <playlist_program>0</playlist_program>
> <stream_once>1</stream_once>
< <!-- <encode>Not supported Yet</encode> -->
> <encode>lame - -</encode>
xxxpi.itline.jp: /etc # ezstream -c /etc/ezstream.xml
曜日によって、好みのアルバムが流れるようにし、どのアルバムを選択しても起床時刻である6:40に最後の曲の再生が終わり、その後にスプラトゥーンの「Now or Never!」もしくは「イマ・ヌラネバー!」が流れるようにしたい。要するに「あと1分!」のタイミングで「あと1分!」のBGMが流れるようにするというわけだ。
というわけで作ったのがこのスクリプト。指定されたディレクトリのflac群から、再生時間が40分未満になるように適当に間引き、最後に「あと1分!」の曲を追加し、再生時間が50分ちょうどになるよう、頭に無音時間を追加したプレイリストを作成する。そしてcron機能により、5:50分からストリーミング再生を開始。
MAILTO=""
40 5 * * 2 ./create_morning_playlist /mnt/mediatomb/YUMI_03_HEAR > playlist.flac.txt
40 5 * * 3 ./create_morning_playlist /mnt/mediatomb/MARI_15_RAINSHINE > playlist.flac.txt
40 5 * * 4 ./create_morning_playlist /mnt/mediatomb/YUMI_05_AI_HA_GENKI > playlist.flac.txt
50 5 * * * /usr/bin/ezstream -c /etc/ezstream.xml