Up
Down
Return

icecastによるmp3のストリーミング

家庭内で特定のマシンにmp3ファイルを蓄え、その他のマシンで聞くことが出来ると、一カ所に集約して管理が出来るので便利です。それにあっちこっちに同じファイルを持つよりもトータルでディスクの使用量が減ります。
Debian GNU/Linuxでは、icecast-serverとicecast-clientの二つのパッケージとなっています。
全体の流れは、

XMMSやWinAMP、RealPlayerなどのmp3ストリームを受け取って音を出すプレーヤ
          |
          |
icecast(Streaming Mpeg Layer III server)
プレーヤの要求により、shoutから受け取ったmp3ストリームをプレーヤへ送る
          |
          |  shoutがicecastにストリームを送る
          |
Shout(Streaming Mpeg Layer III feeder)mp3エンコード/デコーダ
       |                   |
       |                   |
mp3ファイル       shout.playlist(再生するmp3ファイルのリスト)
~~~~~~~~~~~~        ~~~~~~~~~~~~~
       shoutが読み込む

という感じのようです。

これらのパッケージを入れると、icecastは/etc/init.d/icecastによりデーモンとして起動されます。
/etc/default/icecastが設定ファイルで、ここにポートやパスワードなどを指定します。
shoutはコマンドラインから再生するmp3ファイルの一覧リストなどを指定して起動します。

と言うと事も無げですが、実際はicecastとshoutの書き込み権限が違うためのエラーが多発しました。
結局、icecastはブート時には起動せずshoutと同一ユーザでコマンドラインから起動する事にしました。また、これらが使うディレクトリもデフォルトの/tmp/shoutではなく独自に作りました。これで一応、安定して動くようになっています。

$ [29/Jun/2001:21:27:14] Icecast Version 1.0.0 Starting...<===== icecast起動
Icecast comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of Icecast under the terms of the
GNU General Public License.
For more information about these matters, see the file named COPYING.

[29/Jun/2001:21:27:14] server started...
[29/Jun/2001:21:27:14] listening for encoders on port 8001...
[29/Jun/2001:21:27:14] listening for clients on port 8000...
[29/Jun/2001:21:27:14] listening for remote admin on port 8002...
[29/Jun/2001:21:27:14] waiting for encoder or redirection...
[29/Jun/2001:21:28:26] encoder [127.0.0.1:25356] connecting...<===== shout起動
[29/Jun/2001:21:28:26] password accepted...
[29/Jun/2001:21:28:34] directory_add() completed...server id = 26705 and touch f
requency = 5
[29/Jun/2001:21:28:39] directory_touch() completed...
[29/Jun/2001:21:28:39] lost encoder... kicking clients...<===== shout停止
[29/Jun/2001:21:28:44] directory_remove() completed...
[29/Jun/2001:21:28:44] waiting for encoder or redirection...
[29/Jun/2001:21:30:19] encoder [127.0.0.1:35852] connecting...<===== shout再度起動
[29/Jun/2001:21:30:19] password accepted...
[29/Jun/2001:21:30:20] directory_add() completed...server id = 26706 and touch f
requency = 5
[29/Jun/2001:21:30:20] directory_touch() completed...

最初は、 directory_add()や directory_touch() が出来ないというメッセージの洪水だったのです。

なお、再生リスト(shout.playlist)は、
find   mp3ファイルのあるディレクトリ  -name  *.mp3 > shout.playlist
の様にして作成します。
既存のリストに追加するときは、
find   mp3ファイルのあるディレクトリ  -name  *.mp3 > shout.playlist
ですよね。
これで、
$cat shout.playlist
/usr/local/mp3/K466/01Music_0301.MP3
/usr/local/mp3/K466/02Music_0302.MP3
/usr/local/mp3/K466/03Music_0303.MP3
といったファイル(ただ、mp3のある場所をフルパスで書いただけのもの)が出来ます。

このままですと再生リストにあるものを次々に再生するだけですので、リクエストをする機能が欲しくなりました。そこで持ってきたのは、shout_toolsというものです(CMUのサイトにあったのですが、その後消えてしまいました。)。他にもMuSEとかあるのですが一番お気楽そうなのを選んでしまいました。READMEに書いてあることをやればよいだけですが、

  1. 適当なディレクトリに解凍して、
  2. 出来たディレクトリへ移り、
  3. *.htmlファイルを/var/www/shoutを作ってここにコピーしておきましょう。(Debianでは、/var/wwwがデフォルトのドキュメントルートです)
  4. cue.cをエディタで開き、赤字の箇所を訂正します。Debianのデフォルトは/tmp/shout/shout.cueです。ここにストリーミング中のmp3ファイルの情報が書き込まれます。cue.cはコンパイルするとcue.cgiとなりこれがブラウザからの要求によりshout.cueの内容を表示してくれます。/var/www/shout/template.htmlは、その時の表示に使うHTMLのテンプレートです。
    /* modify the following two lines to fit your system */
    #define SHOUT_CUE_FILE "/tmp/shout/shout.cue"
    #define HTML_TEMPLATE_FILE "/var/www/shout/template.html"
  5. 次に、playlist.cを開けて、
    /* modify the next line to point to your default playlist file */
    #define PLAYLIST_FILE "/home/nstrom/list"
    /home/nstrom/listを、再生リストのある場所に書き換えます。
  6. 次に、request.cgiを開き、
    # modify the next three lines to fit your system configuration
    $PLAYLIST = "/home/nstrom/list";
    $SHOUTPLAYLIST = "/usr/local/shout/shout.playlist";
    $CUEFILE = "/usr/local/shout/shout.cue";
    を書き換えます。
    $PLAYLISTは、再生リストのある場所
    $SHOUTPLAYLISTは、shoutが使う作業用ディレクトリで、Debianのデフォルトは/tmp/shout.playlistです。$CUEFILEは、cue.cのSHOUT_CUE_FILE と同じです。$SHOUTPLAYLISTと同じディレクトリとなります。
    # modify the next line to point to your "success" url
    $SUCCESS_URL = "http://reptilian.res.cmu.edu/request/success.html";
    を、/var/www/shout/success.htmlへ訂正します。
  7. make all で、cue.c とplaylist.cをコンパイルし、cue.cgi とplaylist.cgiを作ります。request.cgiはperlのスクリプトなのでコンパイルは不要です。これら3つの*.cgiフィルを/usr/lib/cgi-bin(DebianのApacheでデフォルトのcgi-binディレクトリ)へコピーします。2回目以降のコンパイル時には、make cleanをしてから、make allします。
  8. (icecastと)shoutが動いていることを確認したから、ブラウザで、http://このサーバ/cgi-bin/playlist.cgiを入力して再生リストが表示されるか試してみます。playlist.cgi
    ここで、Internal Server Errorなんてメッセージが出ないことの祈って左の数字をクリックしてリクエストしてみましょう。
  9. http://このサーバ/cgi-bin/cue.cgiで、表示。
    cue.cgi
    再生の進行を棒グラフで表示するために、<META HTTP-EQUIV="Refresh" CONTENT="3">などというタグが入っているので、やたらと慌ただしい表示になっています。
  10. 他のマシンから(shoutが動いているマシンでもよいのですが)からmp3プレーヤを立ち上げて、urlにhttp://[shoutが動いているサーバ]:8000を入力して再生しているものが聞こえるか確認しましょう。(ポートが何番かは/etc/default/icecastの設定に依ります。)


2001年12月初旬の金曜日の夜、「最近はセキュリティアップデートが多いから」と一応、apt-get update、apt-get upgradeをやったら、あらびっくり!”icecastはセキュリティに問題があるのでアップデートします”ってな英語のメッセージが出て、おまけに”/etc/default/icecastは、もう使いません”と出るので二度びっくり。

この更新では、

  1. Debian GNU/Linux potatoでのicecsat-serverのバージョンは、1.3.10-1.1に
  2. /etc/default/icecastの代わりに、/etc/icecast/icecast.conf などで設定
  3. Web Admin で状態を見ることができる

となりました。

/etc/icecastには、 groups.aut、users.aut、mounts.autとかなり細かくアクセス権を設定できます。また、必ずしもここでなくてもよいのですが、i cecast-clientパッケージでインストールするshoutはshout.confで設定できます。このファイルでは、

server_name localhost
password musashino
daemon yes
genre any
name wocchan radio
url http://myagi.jp:8000/
autodetect yes

などを定義します。

もう一つの新機能Web Adminは、stats.logを使いhttp://localhost:8000/list.cgiなどとすると Welcome to Icecast Web Admin Interface が表示されます。