水槽にライブカメラを付けてみた。(ストリーミング配信編)

前回の記事で、UVC 対応の安物 USB カメラを使った撮影画像の配信を行なったが、今度は動画としてストリーミング配信を行う事にした。

利用したのは、ffmpeg と ffserver。ffmpeg は言わずと知れた高機能動画エンコーダで、ffserver はエンコードした動画を配信する為のサーバだ。

ffmpeg をインストールすると、ffserver も同時にインストールされるようで、自分のシステムには既に入っていた。

まずは、ffserver の設定から行う。設定ファイルは、例に漏れず /etc/ffserver.conf だ。

# ffserver の基本的な設定
Port                8090
BindAddress         0.0.0.0
MaxClients          1000
MaxBandwidth        10000
CustomLog           -
# サーバへの入力設定
# フィード(送られてくるストリーミング動画データを受け取るモノ)
<Feed feed1.ffm>
File            /tmp/feed1.ffm
FileMaxSize     2000K
ACL             allow 127.0.0.1
</Feed>
# サーバからの出力設定
# この場合は、aqua120.swf という Flash ファイル。
# Flash のストリーミングプレイヤーも ffserver が生成してくれる。
<Stream aqua120.swf>
Feed            feed1.ffm
Format          swf
VideoBitRate    512
VideoBufferSize 256
VideoFrameRate  30
VideoSize       320x240
VideoGopSize    15
NoAudio
VideoQMin       3
VideoQMax       31
Preroll         0
</Stream>
# サーバステータスページの設定。
<Stream stat.html>
Format          status
ACL             allow localhost
ACL             allow 192.168.0.0 192.168.255.255
</Stream>
# http://example.com:XXXX/index.html にアクセスがあった場合、
# ffmpeg の公式ページにでもリダイレクトしておく。
# これはデフォルト設定で、必須ではない。
<Redirect index.html>
URL             http://www.ffmpeg.org/
</Redirect>

ブラウザでも見れるように、と、上記のよう Flash プレイヤーによるストリーミング動画配信を行う設定にした。その後、ffserver を起動する。

$ sudo ffserver

次に、ffmpeg で USB カメラの映像をエンコードしながら、サーバに渡してやる。

$ ffmpeg -f video4linux2 -s 320x240 -r 15 -b 512 -an -i /dev/video0 http://localhost:8090/feed1.ffm
# video4linux2 … UVC ビデオの映像を扱う為のビデオフォーマットライブラリを指定。
# feed1.ffm … ffserver.conf で設定したフィード名を指定。

エンコードを開始したら、http://127.0.0.1:8090/stat.html をウェブブラウザで表示する。ここで、ffserver のステータス、配信情報などが確認出来る。

設定ファイルで、swf ファイル名を aqua120.swf としたので、映像をブラウザから見るには、http://127.0.0.1:8090/aqua120.swf を開けば良い。

映像の確認が出来たら、一度 ffmpeg と ffserver を停止した。

ffserver、ffmpeg の両者とも、バックグラウンド実行をしていても、やたら STDOUT を汚す。

また、ffmpeg はバックグラウンドに追いやると、エンコードをストップさせるみたいだったので、以下のような stream.sh を書いた。

#!/bin/sh
case $1 in
start)
ffserver  >/dev/null 2>&1 &
pid_ffs=$!
ffmpeg -f video4linux2 -s 320x240 -r 15 -b 256 -an \
-i /dev/video0 http://localhost:8090/feed1.ffm >/dev/null 2>&1 &
pid_ffm=$!
;;
stop)
 # kiken!
killall -9 ffmpeg
killall -9 ffserver
;;
*)
echo "stream.sh stop|start"
;;
esac

メッセージは null デバイスに捨て、それぞれバックグラウンド実行。

stop 時に、他の ffmpeg/ffserver までぶっ殺してしまう危ないスクリプトなのだけれども、特に気にしない。あとは、root になって

$ su
パスワード:
# ./stream.sh start
# exit
$

とすれば、バックグラウンド実行をしてくれる。

うちの水槽の場合、夜間は完全に消灯しているので、画面は真っ暗で何も映らなくなる。

そこで節約の為に、crontab に以下のような記述を追加し、「あさ8時から夕方6時まで絶賛放送中!!!」みたいな事をしてみた。

00       8      *    *   * root sh /dir/path/stream.sh start
00      18      *    *   * root sh /dir/path/stream.sh stop

以下の URL で実際に稼働中のストリーミング動画を見る事が出来る。

http://sasebo.ddo.jp/~dyama/aqua/

f:id:dyama:20110210094434p:image

コメントを残す

メールアドレスが公開されることはありません。