SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|

2016-09-04(Sun) ラズベリーパイ(pidora)でメディアサーバする、そして心地良い目覚めへ

  ラズベリーパイで無線LANアクセスポイントを作り、ラズベリーパイで無線LANブリッジを作ったことにより、愛用のミニコンポ「DENONのRCD-N9」を正しく宅内LANに「有線」で接続することができた。こんな感じに。

  インターネット─[モデム]─宅内LAN─[無線アクセスポイント(ブリッジ)]…無線LAN…[無線ブリッジ(コンバータ)]─直結LAN─[ミニコンポ]

  このような構成にした動機は、RCD-N9の無線LAN接続機能が「どタコ」なことにある。無線経由でflac等を再生中、他の無線トラフィックが増えると、接続が切断され、音楽が切れるのだ。切れると、再接続まで時間がかかるし、曲の再生は最初からになってしまう。それが頻繁に発生する。

  実に「音楽が途切れる」という事態に対しては、恐ろしく高いレベルの腹立たしさを感じさせられるものである。仮にも高品質な音楽の再生を謳う機器においては「極力避けるべき事態」ではないのか。無線LANは不安定だから仕方ない、などということは断じてない。TCPという仕組み上、再生が止まることはあっても切れることはあり得ない。実際、動画サイトで切れるなどという事態に遭遇したことはないはずだ。

  ちょっとtcpdumpでパケットの様子を調べた限りでは、RCD-N9側のTCPスイートに問題があるようで、その点ではRCD-N9は疑うことのない超ド級のクッソプロダクトなのだが、それ以外の点は十分に及第点なので、その点はあきらめて、ラズベリーパイを噛ますことでフォローすることにしたのである。

  具体的にはどうするかというと、上述の通りRCD-N9とラズベリーパイ間を有線LANで直結とし、通信の安定性の低い無線LANの通信をLinuxのNFS接続で保障してやるのである。つまりラズベリーパイ上にDLNAサーバを配置するのである。

  NFSについては、サーバ側で公開の設定をしておいて、

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/

  実用上は、起動時に自動マウントするよう、/etc/fstabに以下のエントリを加えておくことになる。

xxxpi.itline.jp: /root # cat /etc/fstab
server:/home/mrdiatomb  /mnt/mediatomb  nfs  defaults  0 0

  NFSマウントができたら、DLNAサーバであるMediaTombを導入する。作業はこれだけ。

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頃に気分よく起き出すのだ。

  ところが問題がある。CDのセットが面倒くさい。毎日のアラームをセットすると休みの日にも流れてしまう(気づかないが)。CDの長さによって、起き出す時刻に曲が終わってしまったりする。

  仕方ないといえば、仕方ないが、そこをサッサとあきらめたりしないのがエンジニアである。インターネットラジオ機能で、自分専用に曲をストリーミング配信することで、上記をまとめて解決してしまうのである。おそらく、インターネットラジオ配信において、最短配信距離記録ギネス更新(直線距離10cm以下)という偉業達成の瞬間ではないかと思う。

  ストリーミング配信のアプリにはicecastを使う。例によって、ググると大量のサイトが引っかかるのだが、手順は書いてあるものの、その意図がよくわからない。どうも、こういうことのようだ。

  icecastは、フロントエンドサービスを行うアプリ。ウェブサーバとして振る舞い、インターネットラジオ聴取クライアントに曲を配信する。が、自らは曲を扱わず、インターネットラジオ配信クライアント(?)から曲の提供を受ける。

  icesは、インターネットラジオ配信クライアント。icecastにアクセスし、icecastが配信する曲を提供する。んが、icesはバージョン2からOggVorbis形式の配信しか対応していないようで、mp3形式では配信できない。古いicesはできるようだが、そんなものを使うべきではないだろう。

  ezstreamは、icesと同じく、インターネットラジオ配信クライアント。icecastにアクセスし、icecastが配信する曲を提供する。こっちはmp3形式での配信に対応している。

  上記はどれも、Icecastスイートとしてxiphという開発コミュニティで扱っているようで、ここはOggVorbisやflacの開発主体でもあるようだ。

  配信形式によって、アプリの使い分けが必要なことや、配信形式が特定の形式に限定されている意味がよくわからんが、なにせflacでの配信はできず、RCD-N9も対応していないので、mp3形式での配信が妥協点である。

  というわけで、icecastの導入、設定である。

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

  とりあえず、これだけでhttp://xxxpi:8000/にアクセスすると結果が返るようになる。

  次は、ezstreamの導入、設定である。

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 

  最初からflacのサンプル記述があるので、lameを噛ます指定を加えるだけだ。リアルタイムエンコーディングだから、配信中のCPU使用率はハネ上がるが、特に音飛びが起こるほどでもなく、問題はない。

  そして、今回はまだ続く。

  曜日によって、好みのアルバムが流れるようにし、どのアルバムを選択しても起床時刻である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

  RCD-N9の側ではアラーム機能の開始時刻を5:50に設定、入力ソースにはインターネットラジオのオレオレトリーミングチャンネルを選択。

  というわけで、夢の起床環境へまた一歩近づいた。これにて、ハイパーモーニングサーバの完成……といいたいところだが、実は、まだまだ実現したい機能があるのであった。それはまたそのうちに。