この記事は?
以前書いた Raspberry Pi と安価なWebカメラで静止画を撮影する の続きです。
今回は安価なUSB接続のWebカメラを使用して、動画を撮影してみます。
環境
Raspberry Pi と安価なWebカメラで静止画を撮影する で作成した環境を継続して利用します。
追加でパッケージをインストール
動画撮影では ffmepg
を使用します。パッケージを追加でインストールしておきます(デフォルトで入っているかもしれませんが念の為)。
$ sudo apt-get install ffmpeg
カメラが扱える動画フォーマットを確認する
使用するWebカメラのハードウェア仕様により、カメラ側で扱える動画フォーマットが異なります。
以下のコマンドで扱えるフォーマットを確認します。
$ v4l2-ctl -d /dev/video0 --list-formats
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUYV 4:2:2
Index : 1
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : Motion-JPEG
今回使用するBuffaloのWebカメラだと、カメラ側では YUYV と Motion-JPEG のフォーマットが扱えることがわかります。
動画を撮影する
h.264 で動画を保存する
カメラ側では h.264 のフォーマットは扱えないため、カメラで撮影した動画をラズパイ側で h.264 にエンコードして保存してみます。
$ ffmpeg \
-f alsa -thread_queue_size 32768 -i hw:1,0 \
-f v4l2 -thread_queue_size 32768 -s 1920x1080 -i /dev/video0 \
-c:v h264_omx -b:v 2m \
-c:a aac \
-f segment -segment_time 30 -segment_format_options movflags=+faststart -segment_wrap 10 \
output%02d.mp4
ffmpeg
のパラメータの意味(超ざっくり)は以下の通りです。
- 2行目: 音声の取得関係
- 3行目: 映像の取得関係
- 4行目: 映像のコーデック
- 5行目: 音声のコーデック
- 6行目: ファイルの分割関係
- 7行目: 保存するファイル名
実際に動かしてみた結果
さすがにフルHD画質(1920x1080)だと厳しいです。5fpsくらいのカクカク動画になります。
試しにHD画質(1280x720)に変更しても、それでも10fps前後くらいにしかなりません。
CPUは1コアだけフルに使っている感じです。
どのレベルの動画を求めるのかにもよりますが、ヌルヌルな動画を保存しておきたい用途には厳しいと言わざるを得ません。
Motion-JPEG で動画を保存する
カメラ側がサポートしている、Motion-JPEGで動画を保存してみます。
$ ffmpeg \
-f v4l2 -input_format mjpeg -video_size 1920x1080 -framerate 30 -i /dev/video0 \
-c:v copy \
-f segment -segment_time 30 -segment_wrap 10 \
output%02d.mkv
ffmpeg
のパラメータの意味(超ざっくり)は以下のとおりです。
- 2行目: 映像の取得関係 (
mjpeg
から入力、映像サイズ、フレームレート指定) - 3行目: 映像のコーデック (
copy
: エンコード無しで生データを保存する) - 4行目: ファイルの分割関係
- 5行目: 保存するファイル名
実際に動かしてみた結果
Motion-JPEGを使用すれば、きちんと フルHDサイズ 30fps で保存できます。
ただし、フルHD 30fps だと 30秒の動画でファイルサイズが200MB超となり、ストレージ容量的にちょっと厳しい印象です。
また、Motion-JPEG ですので音は出ません。
もうちょっとなんとかするためには?
カメラ側でh.264をサポートしている製品を使えば、もう少しマトモに動画を扱えるような気がします。
試していないのですが、Logicool のこのカメラ はカメラ側でh.264をサポートしているように書かれている気がします(試してはいない)。
ただし、お値段1万円超。「安価なWebカメラで」という前提がちょっと崩れてしまう感じです。