手持ちの MP3ファイル (もちろん著作権的問題のないもの) を Webで公開したい、ということが時々ある。不通にファイルをサーバ上に置いて適当なページからリンクをはればいいだけの話なのだが、それだと使っているブラウザによっては、そのリンクを実行した時に、まずダウンロードして保存するか実行するか、といったようなことを聞いてくる。このとき、「保存」してしまった場合、そのファイルを改めて探して開いてやらないと中身を聞くことができない、という問題がある。回線速度が早い場合は、単に再生のためのステップが一つ増えてめんどくさいだけの話なのだが、回線速度が遅い場合は、ダウンロードが終わるまで待たないといけないという、ユーザにとってはストレスの原因となる問題がある。そこで、ストリーミングっぽく、リンクを実行したらダウンロードと同時進行でデータが再生されるようにはできないものかと考えて、あれこれと試してみた。
Icecast
FreeBSD Ports Collection の中をいろいろとあさって、 Icecastなるものを発見した。なんとなくストリーミングができそうなことが書いてあるので試してみた。が、結論だけ書くと、このソフトはどうやら常にオーディオ・ストリームを流してくれるサーバを構築するものらしい。したがって、リンクをクリックした時にストリーミングが始まる、というようなことはできないらしい。手持ちの MP3を溜め込んだディレクトリの中からランダム再生してくれるストリームを作ったりできるようなので、家庭内ネットラジオとかやりたい人にはいいだろう、という感じがした。
AmpleとGNUMP3d
さらにいろいろとあさってみると、 Ampleというのと、 GNUMP3dというのを発見した。簡単に言えば、どちらも指定されたディレクトリの中にあるMP3 (や GNUMP3dの場合は他のオーディオ・フォーマットも) のファイルの一覧を動的に生成して HTML化して、ユーザはそのページを見てサーバ上のファイルを選んで再生できる、というものらしい。そして、少なくとも GNUMP3dの場合はストリーミングっぽくできるらしいことが分かった。
Ampleは、実行してみたらなぜか不可解なエラーが出たのであまり深追いしなかった。ただし、実行したのは最新バージョンではなかったことが後になって分かった。また、エラーの原因がプログラムの問題なのか、設定ファイルをいいかげんに書いたのが原因なのかも追求していない。
GNUMP3dの方をいろいろと設定してみていると、設定ファイル中のコメントから、MP3ファイルに直接アクセスすると「保存」か「開く」かを聞いてくる user agentでも、 .m3u ファイル (プレイ・リストらしい) にアクセスした場合、その中にリストされているファイルに関してはダウンロードしながら再生してくれるらしい、ということが判明した。そこで、適当に GNUMP3dを設定して起動してから、telnet でそのポートにアクセスして .m3uファイルに対する GETリクエストを投げてみた。すると、Content-Type が audio/x-mpegurl
で、中身がその MP3ファイルのURLというのが返ってきた。ということは、別に GNUMP3dを使わなくても、こういうファイルへリンクしてやることでストリーミングっぽいことができるのではないか、という結論に達した。
[えせ]ストリーミングの実現
ということで、たとえば http://www.trashpot.org/test.mp3
というファイルをオンデマンドでストリーミング配信したいとすると、
- HTTPDサーバーが、 .m3uという拡張子を持つファイルに対するリクエストがきたとき、 content-type として
audio/x-mpegurl
が返されるように設定する。 (手元の Apche 2.0.47ではもともと mime.typesに入っていたので特に設定変更の必要はなかった。) http://www.trashpot.org/test.mp3
という 1行からなるファイルを作って、たとえば test.m3uという名前で保存する。- HTMLのページからは、 test.m3uに対するリンクをはる。
これで、少なくとも Windows Media Player 9, RealOne Player では、ダウンロードをしながら再生してくれるようである。