alsaドライバ + jackd + icecast2 + darkiceでネットラジオ配信

ustreamyoutubeなどでラジオの配信などは本当に楽ちんになりましたが、独自に広告をとったりしてネットラジオ局を公開することもできます。smoothjazzやsomefmと同じような仕組みを作る方法です。

サーバはlinuxサーバ。事情によりdebianではなくubuntu(Linux 2.6.32-27-generic#49-Ubuntu)で作りました。

ネットラジオ放送の仕組みはサーバとクライアントが必要です。考え方としてはサーバという放送局に対して出先のスタジオから放送内容をサーバに送って配信することになります。

1 client(darkice) → 2 server(icecast2) ⇔ リスナー(itunes/winamp/VLC)

という仕組みです。

1のクライアントから構築していきます。

audio inはalsaドライバ + jackdを使います。alsaはaudioドライバでjackdはひとつのインターフェースを同時に使えるようにするラッパーのような物と思っておけば良いと思います。jackdを通さなくてもいいのですが通さないと同時に複数利用ができなくなります。録音しながらラジオ配信とかする場合はjackdは必須です。

ALSAドライバ + jackdのインストール

# apt-get install linux-backports-modules-alsa-lucid-generic
# apt-get install jackd
# apt-get install libasound2
# apt-get install libasound2-plugins # for libasound_module_pcm_jack.so
# apt-get install darkice
# apt-get install icecast
# apt-get install lame

audioドライバがちゃんと動作し、認識しているかは下記の方法で確認できます。

# aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: SIS966 [HDA SIS000], デバイス 0: ALC000 rev1 Analog [ALC000 rev0 Analog]
  サブデバイス: 0/1
  サブデバイス #0: subdevice #0

という感じです。
さらに録音ができるかどうかは下記の方法で確認できます。

# arecord -t wav -d 5 test.wav

aplay/arecordが入っていない場合は別途インストールして下さい。

次にjackdを走らせます。

/usr/bin/jackd -R -d alsa -d hw &

jackdのオプションは下記の通り

usage: jackd [ --no-realtime OR -r ]
             [ --realtime OR -R [ --realtime-priority OR -P priority ] ]
      (the two previous arguments are mutually exclusive. The default is --realtime)
             [ --name OR -n server-name ]
             [ --no-mlock OR -m ]
             [ --unlock OR -u ]
             [ --timeout OR -t client-timeout-in-msecs ]
             [ --port-max OR -p maximum-number-of-ports]
             [ --debug-timer OR -D ]
             [ --no-sanity-checks OR -N ]
             [ --verbose OR -v ]
             [ --clocksource OR -c [ c(ycle) | h(pet) | s(ystem) ]
             [ --replace-registry ]
             [ --silent OR -s ]
             [ --version OR -V ]
             [ --nozombies OR -Z ]
         -d backend [ ... backend args ... ]
             Available backends may include: alsa, dummy, freebob, firewire, net, oss, sun, or portaudio.

       jackd -d backend --help
             to display options for each backend

複数のインターフェースがあって入力端子、チャンネルを指定したい場合は

/usr/bin/jackd -d alsa -d hw:0 -r 44100 &

などと明確に指定もできます。

.asoundrcの設定

次にalsaから入ってきてる音声入力をjackdでどのような振る舞いをさせるかの設定をします。

# cd ~
# vim .asoundrc
pcm.jackplug {
	type plug
	slave { pcm "jack" }
}
pcm.jack {
	type jack
	playback_ports {
		0 alsa_pcm:playback_1
		1 alsa_pcm:playback_2
	}
	capture_ports {
		0 alsa_pcm:capture_1
		1 alsa_pcm:capture_2
	}
}

.asoundrcの設定方法の詳細は
http://wikiwiki.jp/tetsuya/?asoundrc

alsaドライバをjackd経由で動作しているか確認するには

# aplay -D pcm.jackplug file

などとしてpcm.jackplugを介してwavファイルなど再生してみることでテストが可能です。

icecast2の設定(serverの設定です。場合によっては異なったマシンの場合があります。)

icecastの設定は簡単です。icecastのバージョンをしっかりと把握すること、そしてパスワードの設定をしっかりすることが重要です。icecastのバージョンが違うだけでのちに行うdarkiceの設定でつまずきます。ここではicecast2であるということで設定していきます。

/etc/icecast2/icecast.xmlを編集(変更部分のみ記述)

    <authentication>
        <source-password>kmusiclife</source-password>
        <relay-password>YOUTPASSWORD</relay-password>
        <admin-user>admin</admin-user>
        <admin-password>YOURPASSWORD</admin-password>
    </authentication>

YOURPASSWORDの部分を設定変更。

サーバサイドでicecast2を再起動/起動します。

# _etc/init.d/icecast restart

darkiceの設定と配信

darkiceからicecast2にたいして音声データを送ります。icecastが実際に配信をします。darkiceの設定は下記のとおりです。

/etc/darkice.cfg にファイルを作成/編集

[general]
duration        = 0
bufferSecs      = 5

[input]
device          = jack_auto # pcm.jackplugでは安定しなかったです
sampleRate      = 44100
bitsPerSample   = 16
channel         = 2

[icecast2-0]
format          = mp3
sampleRate      = 44100
channel         = 2
bitrateMode     = abr
bitrate         = 128
lowpass         = 10500
server          = icecast_server.com
port            = 8000
password        = YOURPASSWORD
mountPoint      = radio.mp3
name            = CHANNEL NAME
description     = CHANNEL DESCRIPTION
url             = http://www.kmusiclife.com
genre           = radio
public          = no
remoteDumpFile  = /tmp/radiochannel.mp3

device = pcm.jackplugにするとxrun errorが出て安定しませんでした。
jack_autoにするとxrun errorがでなくなり安定しました。

上記は配信サーバicecast_server.com:8000/radio.mp3という名で配信を行います。
lameでmp3にエンコードして配信します。oggでも配信が可能です。

darkiceからicecastに配信

darkiceを起動しicecastに対して配信を開始します。

# /usr/bin/darkice &

この時にエラーがややこしいのでアドバイスしておきます。

Using ALSA DSP input device: pcm.jackplug
Using POSIX real-time scheduling, priority 98
DarkIce: LameLibEncoder.cpp:75: lame lib opening underlying sink error [0]

というエラーが出ることがあります。このエラーはlameのエラーではなく認証のエラーの場合が多いです。icecast.xmlなどのパスワードを確認して下さい。認証ではねられている可能性があります。よくあるケースとしてはicecastのバージョンを間違えているということがあります。確認して下さい。

うまく行けば

DarkIce 0.20.1 live audio streamer, http://darkice.tyrell.hu/
Copyright (c) 2000-2007, Tyrell Hungary, http://tyrell.hu/

Using config file: /etc/darkice.cfg
Using ALSA DSP input device: pcm.jackplug
Using POSIX real-time scheduling, priority 98

というメッセージが出たりします。

配信しているラジオを聴く

icecast_server.com:8000/radio.mp3 で配信しているラジオを聞くにはVLCを入れると分かりやすいです。

VLCを起動 → ファイル → ネットワークを開く → URLにラジオのURLを入力します。

例) http://icecast_server.com:8000/radio.mp3

認証を通したい場合いはicecast認証などと調べてみてください。webインターフェースからクライアント側の認証ができます。basic認証なのでURLにuser/passを埋め込めますので便利です。