前回の記事で、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 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。