【FFMpeg】ネットワークカメラとffserverを使ってライブ配信
前の記事では、USBカメラを使ってライブ配信をしてみたけど、今度はネットワークカメラを使ってライブ配信をやってみた。
CoTVの機能拡張にもなるしね。
安価なUSBカメラと違ってネットワークカメラはちょっと高め。定価が20万円ぐらい。
でもカメラ自体にサーバ機能があって、直接http経由でアクセスするだけで、ライブ配信を見れたり操作できたりするので、20万円でも安いと思う。
今回は複数のネットワークカメラの映像をリアルタイムエンコードして、次のことを試してみた。
- ネットワークカメラ自体に接続制限(30人ぐらい)があるが、これを超えた人数のライブ配信を可能とする
- 複数のカメラの映像を1つの画面で並べて表示する
- 音声も取得、配信する
ネットワークカメラはPanasonic, Sony, Canonなどが出しているけど、外部からアクセスできるSDKを提供してくれているCanonのカメラを使うことにした。
ちなみに聞いた話だとカメラ性能はPanasonicの方がいいらしい。
使ったカメラはCanon VB0-C60。マイクとスピーカーは内蔵されていない。
別製品のVK-16とかカメラに付属しているVK-Liteを使うと複数のカメラを並べて表示ができる(もちろん音声も)。
さて、本題。
FFMpegのインストールは前の記事を参考に。
ライブ配信可能にするffserverはFFMpegのインストールと同時に使えるようになる。
ffserverの設定ファイルをソースからコピー
# cp /opt/software/ffmpeg-0.5/doc/ffserver.conf /etc/
設定ファイルを編集。設定の仕方はこの辺を参考に。
# vi /etc/ffserver.conf
feed1.ffmをfeedに指定して、複数のFormatを記述できるが、これはfeed1.ffmに出力されてきた動画を指定した分だけ同時にエンコードする。その分CPUパワーは必要。
BitRateなどはkbits/sなのでFFMpegの変換オプションより0が3つ少なくなるので注意。
設定後ffserverを起動。バックグラウンドで。
# ffserver &
http://<サーバIP>:8090/stat.html
にアクセスするとffserverの状態を確認できる。
で、ネットワークカメラの映像を入力としてリアルタイムエンコードをしてみる。
# ffmpeg -i 'http://192.168.100.1/-wvhttp-01-/video.cgi?v=mp4:640x480:5:15' -b '512000' -r '15' http://localhost:8090/feed1.ffm
変換が無事開始されれば、ライブ配信が開始されているのでstat.htmlから確認する。エラーで怒られる場合は、feed1.ffm宛てではなく普通にmp4とかで変換できるかを確認。
このときのffserver.confの箇所はこんな感じ。
<Stream test.swf>
Feed feed1.ffm
Format swf
VideoFrameRate 15
VideoSize 640x480
VideoBitRate 512
VideoBufferSize 80
VideoGopSize 30
#AudioBitRate 256
#VideoIntraOnly
NoAudio
</Stream>
ffmpegの変換オプションとffserver.confの値が一致しないと変換に失敗するので注意。
ffserverを再起動する場合は
# fg
Ctrl-Cで強制終了
# ffserver &
ffserver.confの値を変更すると
Codec bitrates do not match for stream
と怒られたりするので、ffserver.confを変更したあとは
# rm –f /tmp/feed1.ffm
で削除したほうがいいみたい。
なんかのタイミングで別ジョブになった場合は
# ps –A
# kill 10001
とかで直接プロセスをkillする。
誰かが起動スクリプト作ってそう。あとで検索してみよう。
音声もリアルタイムエンコードできたけど、動画と一緒にするとずれる。同期をとるのが大変そう。