水槽にライブカメラを付けてみた。(ストリーミング配信編)
前回の記事で、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 で実際に稼働中のストリーミング動画を見る事が出来る。
2020/07/02編集註: 停止済み。
※ 2020/07/02 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。