Raspberry Pi でライブ配信する

概要

f:id:jakalada:20150104190509p:plain

Webカメラを利用してRaspberryPiでライブ配信を行います。

ライブ配信はmotion、avconv(旧ffmpeg)などで行うこともできますが、この記事ではMJPG-streamerを利用します。

使用機器

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は認識されたデバイスのvideo0video1に置換されます。

再起動後、ライブ配信が確認できれば、自動起動設定は成功です。