Raspberry Pi でライブ配信する
概要
Webカメラを利用してRaspberryPiでライブ配信を行います。
ライブ配信はmotion、avconv(旧ffmpeg)などで行うこともできますが、この記事ではMJPG-streamerを利用します。
使用機器
- Raspberry Pi: Raspbian(2014-12-24)
- Webカメラ: DS-3DW300 BK/WH
100円均一で投げ売りされていたWebカメラを大量に購入していたので、今回はそれを有効活用しました。
MJPG-streamer
MJPG-streamerについて
JPEG形式の画像を連続で表示することで動画にするMotion JPEGという形式があり、MJPG-streamerはWebカメラの動画をその形式に変換してHTTPで配信を行ってくれます。
インストール
まず、任意のディレクトリにMJPG-streamerのプロジェクトをチェックアウトします。
$ sudo apt-get install subversion
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
チェックアウトが完了したら、プロジェクトのディレクトリに移動して、MJPG-streamerが依存しているパッケージのインストール後、ビルドを行い、/usr/local
以下にインストールします。
$ sudo apt-get install subversion libv4l-dev libjpeg8-dev imagemagick
$ make USE_LIBV4L2=true clean all
$ sudo make DESTDIR=/usr/local install
動作確認
WebカメラをRaspberry Piに接続してから、Webカメラがビデオデバイスとして認識され、/dev/video0
が作成されていることを確認して下さい。
以下のコマンドを実行後、Raspberry Piと同じネットワークに参加しているPCのブラウザでhttp://RaspberryPiのIP:8080
にアクセスし、MJPG-streamerのWebページが表示され、ライブ配信が確認できればインストールは成功です。
$ sudo mjpg_streamer \
--input "/usr/local/lib/input_uvc.so -d /dev/video0 -r 320x240 -f 20 -y -n" \
--output "/usr/local/lib/output_http.so -p 8080 -w /usr/local/www"
コマンドの実行に失敗する場合は、使用しているWebカメラに合わせてオプションを変更してみてください。
自動起動設定
rc.localや起動スクリプトでは動作しない場合があったため、WebカメラがUSBデバイスとして認識されたときにコマンドを実行するように設定します。
参考のURLはRasberry PiではなくArmadilloという似たような製品の開発ドキュメントなので注意してください。
まず、以下のスクリプトを/etc/config/mjpg_streamer.sh
として保存します。
(2015/01/16 修正)
#!/bin/sh ACTION=$1 DEVICE=$2 RUNFILE="/var/run/mjpg_streamer.${DEVICE}.pid" MJPG_STREAMER="/usr/local/bin/mjpg_streamer" PLUGIN_IN="/usr/local/lib/input_uvc.so -d /dev/${DEVICE} -r 320x240 -f 20 -y -n" PLUGIN_OUT="/usr/local/lib/output_http.so -p 8080 -w /usr/local/www" make_run_file() { echo $1 > $RUNFILE } start_action() { if [ ! -z "`ls ${RUNFILE} 2>/dev/null`" ]; then return fi $MJPG_STREAMER -b -i "$PLUGIN_IN" -o "$PLUGIN_OUT" > /dev/null 2>&1 make_run_file $! } stop_action() { if [ ! -e ${RUNFILE} ]; then return fi kill `cat ${RUNFILE} 2>&1` >/dev/null 2>&1 rm -f $RUNFILE } case $1 in start) start_action ;; stop) stop_action ;; *) ;; esac
スクリプトに実行権限を付加します。
$ sudo chmod +x mjpg_streamer.sh
このスクリプトは以下のように使用できます。
# /dev/video0のウェブカメラを指定してmjpg_streamerを開始する
$ /etc/config/mjpg_streamer.sh start video0
# /dev/video0のウェブカメラを指定してmjpg_streamerを停止する
$ /etc/config/mjpg_streamer.sh stop video0
WebカメラがUSBデバイスとして認識されたときに開始、抜かれたときに停止させるために、udevという仕組みを利用します。udevでは、udevルールというものを記述することで、イベントごとの動作を変更できます。
以下のudevルールを/etc/udev/rule.d/10-mjpg_streamer.rules
として保存します。
ACTION=="add", KERNEL=="video*", SUBSYSTEM=="video4linux", RUN+="/etc/config/mjpg_streamer.sh start %k"
ACTION=="remove", KERNEL=="video*", SUBSYSTEM=="video4linux", RUN+="/etc/config/mjpg_streamer.sh stop %k"
RUN+="/etc/config/mjpg_streamer.sh start %k"
が実行されるコマンドの指定で、%k
は認識されたデバイスのvideo0
やvideo1
に置換されます。
再起動後、ライブ配信が確認できれば、自動起動設定は成功です。