Title: PICKLES上でのMP3ストリーム配信について Author: kimoto@ohnolab.org Date: 2001/03/10 1.はじめに このドキュメントはPICKLES上でMP3ストリームを配信するために必要な 技術の調査と予備実験について記したものです。 執筆当初のプラットホームはBSD/OS版PICKLESでしたが、途中からFreePICKLES での実験が主になっています。 2.概要 2-1. MP3ファイルの再生 UNIXで動作するMP3プレイヤーにはmpg123, amp, x11amp, replayなどが あります。このうち、mpg123は標準でMP3ストリームに対応しています。 x11ampはplug-inを追加することによってMP3ストリームに対応します。 PICKLESにはmpg123が標準搭載されているので、MP3ストリームを受信 できます。また、Windowsのユーザの場合は、WinAmpかRealPlayerで 受信できます。 2-2. MP3ファイルの作成 icecast-1.3のドキュメントによると、UNIXで動作するMP3エンコーダには 以下のものがあります。 encoder : Andreas Johanssonによるdist10の改良版です scrEamer : Isaac Richards によるエンコーダです Lame3.x : フリーのエンコーダでもっとも広く使われている ものです L3enc : Fraunhofer作による旧作のエンコーダです mp3enc : Fraunhoferが現在開発しているエンコーダです XingMp3enc : Wingが販売しているLinux用の商用のエンコーダです。 MMX命令を利用しているらしく、非常に高速に動作 するそうです。しかしbeta版ではLiveiceではステレオで 動作しないとのことです。 この中ではLAMEがもっとも広く用いられているエンコーダのようです。 LAMEについては4章で詳しく述べます。 2-3. MP3ファイルの配信 icecastを使うとMP3のファイルをネットワーク配信できます。またmsend (multicast send)の標準入力にMP3のファイルを与えると、そのままMulticast で送り出せるようです。 3. icecast 3-1. icecastの概要 icecastのweb siteはhttp://www.icecast.orgです。 icecastはMP3を放送するためのアプリケーションです。icecast本体は 配送処理のみを行います。音声データを供給する処理は外部に出されて います。音声データを供給するモジュールはエンコーダと呼ばれます。 icecastのパッケージには、shoutとliveiceというエンコーダが含まれて います。shoutは与えられたMP3ファイルの一覧を順番にicecastに送ります。 liveiceは単純なMP3ファイルの送出だけではなく、転送rate変換やLine等の 外部オーディオとの合成などを行いつつ音声を送出できます。 encoders +--------+ +-------+ +------+ | shout |--------|icecast|---- . . Internet . . ---- |client| +--------+ _/+-------+ +------+ _/ +--------+ _/ | liveice|_/ +--------+ 3-2. icecastのインストール icecastは1.1.4と1.3という二つの版が配布されています。当然1.3のほうが 新しいのですが、1.3はpthreadを利用しているためPICKLES上では問題が生じ ます。まずコンパイルするためにconfigureを数箇所修正しなければなりません。 修正するとコンパイルできるのですが、実際にサーバを動作させてクライアント から接続すると、聞こえてくる音はぶち切れのものになります。おそらくBSD/OS のpthread libraryの問題だろうと思います。1.1.4ではこのような問題は 発生しません。 以下ではicecast 1.1.4のインストール手順と設定方法について述べます。 ここではPICKLESを例にとり、/local/icecast以下にインストールすることに します。 % tar zxf icecast-1.1.4.tar.gz % cd icecast-1.1.4 % setenv CC shlicc2 % ./configure --prefix=/local/icecast/ % make -k これを実行するとliveiceのコンパイルでエラーになります。これは、BSD/OSの sound device driverが古いことが原因ですが、今はliveiceは使わないという ことで、気にしないことにします。 コンパイルが終了したらインストールします。といっても、make install という気のきいた機能はないみたいなので、手でコピーします。 # mkdir /local/icecast # cd /local/icecast/ # mkdir bin etc log shout # cd ${SOMEWHERE}/icecast-1.1.4/ # cp icecast shout/shout shout/listen /local/icecast/bin/ # cp shout/shoutrc.example /local/icecast/etc/shoutrc # cp icecast.conf /local/icecast/etc/ 3-3. icecastの立ち上げと運用 /local/icecast/etc/icecast.conf を編集します。 最低修正すべき箇所は以下の項目です。 name ... サーバの名前。適当にそれっぽいものにする。 url ... サーバのURL。適切に設定する logfile . ログファイルの置き場所。/local/icecast/log/icecast.logが適当。 encoder_passwd .. エンコーダのパスワード icecastを起動します。 # /local/icecast/bin/icecast -c /local/icecast/etc/icecast.conf 次に音源を用意します。 /local/icecast/etc/shoutrcを編集してください。最低修正すべき箇所は 以下の項目です。 base_dir ... /local/icecast/shout/ にしてください。 password ... icecast.confで指定したencoderのパスワードにしてください。 適当なMP3ファイルを用意し、shoutを実行します。 # /local/icecast/bin/shout -C /local/icecast/etc/shoutrc filename.mp3 複数のファイルを順番に演奏したい場合は、ファイル名を /local/icecast/shout/shout.playlist に一行に一つずつ列挙します。 面倒な場合はMP3ファイルが置いてあるディレクトリを指定して find ${MP3DIR} > /local/icecast/shout/shout.playlist などとすると良いです。 動作確認するためには % mpg123 http://localhost:8080 を実行してください。ポート番号はicecast.confで変更できます。 3-4. icecastを用いたライブ音声配信 ライブ配信を行うためには、liveiceというエンコーダを用います。 liveiceはPCMデバイスからの音をエンコードするだけでなく、他のMP3を decodeし、PCMデバイスからの入力とmixしてエンコードすることもできます。 liveiceはこの機能を実現するために、以下のプログラムを呼び出します。 - mpg123: MP3デコーダ - lame: MP3エンコーダ これらのプロセス間のデータの受け渡しには、raw.pipe, mpeg.pipeの二つの 名前付きパイプが用いられます。また、liveice自身も二つのプロセスに分岐 して動作します。 liveiceと外部プロセスの関係を図に表すと、以下になります。 mpg123 --> (liveice) -> |raw.pipe| -> lame -> |mpeg.pipe| -> (liveice) / | /dev/dsp V icecast liveiceの実行は、liveice.cfgを編集して、liveiceを実行するだけです。 liveice.cfgで重要なのは、ミキサーモードにするかとサウンドカードを 使うかという二点です。ミキサーモードにした場合は、mpg123を起動し、 playlistに書かれたMP3のファイルを順番に演奏します。サウンドカード を持っていないマシンで実行する場合は、NO_SOUNDCARDの行を有効にして ください。 また、以下の点に注意してください。 - liveice.cfgはカレントディレクトリにあるものしか参照しない - raw.pipe, mpeg,pipeはカレントディレクトリに600で作成する。 - icecast 1.1.4付属のliveiceの場合、標準ではlameに対応していないため、 以下のスクリプトをlamerという名前で作成する必要がある。 #!/bin/sh exec lame -x -r "$@" - mpg123, lame ともにpathが通っている必要がある。 - Ctrl+cでプロセスを停止できないため、前もって別のコンソールを用意 しておくこと。'+'の入力でliveiceは終了するはずだが、何故か機能して いない。 注) icecast 1.1.4にはliveiceが付属しますが、icecast 1.3.7では別配布 となっています。最新版を入手するためには、www.icecast.orgから 3rd party softwareのリンクをたどってください。 4. LAMEについて この章ではUNIX上で動作するMP3エンコーダであるLAMEについて詳しく述べます。 注) この内容は古いlame(3.40)を対象としているため、最新のコードでは 状況が変わっている可能性があります。 4-1. LAMEのコンパイルとインストール LANEのソースコードは、ISOが提供しているMPEGエンコーダのソースに対する patchの形で配布されています。 注) 最新のLAME 3.70は、単体のパッケージに全てが含まれています。 lame3.70.tar.gzを展開して、./configure; makeを実行するだけです。 4-2. LAMEの実行 何もオプションを指定せず、入力ファイルと出力ファイル名だけど指定して LAMEを実行すると、wavファイルを128KbpsのMP3に変換します。入力ファイルの サンプリング周波数等は自動判別されます。出力ファイルのビットレートを変 えたい場合は-b に続いて指定してください。 引数をなにも付けずにlameを実行すると、オプション一覧が出力されます。 4-3. LAMEの実行速度 LAMEの実行速度ですが、『遅い』です。著者が日頃Windows上で利用してる scmpxというMP3エンコーダと比較するとおおよそ2.5倍の処理時間を必要と します。 参考までに実行時間の例を以下に示します。この計測は、PemtiumII 333MHz のノートパソコンで行いました。もとになったPCMのファイルはTiMidityの 演奏結果をファイルに出力したものです。 WAVファイルの型式: 44KHz, 16bit (演奏時間 3:44) MPEG1-128Kbps MPEG1-32Kbps no option 14:55 11:55 -h option 13:18 18:43 -f option 10:53 7:08 WAVファイルの型式: 22KHz, 16bit (演奏時間 3:44) MPEG2-128Kbps MPEG2-32Kbps MPEG2-16Kbps MPEG2-8Kbps no option 6:11 8:34 8:34 8:34 -h option 8:05 9:02 9:02 9:02 -f option 6:04 5:42 5:33 5:28 5. TiMidityを用いた音楽配信 5-1. TiMidityとicecastの連携 TiMidityを使って、MIDIファイルをMP3に変換して配信したいという需要は あるのではないかと思います。 この章の内容は随時変わる可能性があります。 5-2. TiMidityを用いたライブ音声配信 icecast 1.1.4付属のliveiceを改造して、TiMidityの出力をMP3で配信する ようにしました。プログラム名はtimidiceです。といってもliveiceでmpg123 を立ち上げていた代わりに、timidityを立ち上げるようにしただけです。 timidityの実行時引数は、-Or -o - -s 44100 -ir 7777 で固定になっています。 引数の最後がir 7777 (TiMidityサーバ)であることからも分かるように、主に stethoでの利用を目的として開発しました。 プロセス間の関係は以下のようになっています。 timidity -> (timidice) -> |raw.pipe| -> lame -> |mpeg.pipe| -> (timidice) / | /dev/dsp V icecast これについては、現在開発/改良中で、以下の課題を抱えています。 - 長時間運用するとlameが異常終了してしまうことがある。 - 新しいliveiceに追従していない - timidityの引数が固定