【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する。

誰かが起動スクリプト作ってそう。あとで検索してみよう。

音声もリアルタイムエンコードできたけど、動画と一緒にするとずれる。同期をとるのが大変そう。