ffmpegだとうまくh264入力に切り替えられない様子なので、v4l2の標準出力(stdout)をつかう
まとめ
Raspberry Pi Zero 2 wの場合、本来ならffmpegがカメラからH.264データを取得できるはずが、コマンドがKilledで止まってしまい、うまくいかない。
Raspberry Pi 4ならうまくいった。
- PiZero2とPi4とのメモリやハードウェア性能の違いによるものか?
- もしかしたら、ffmpegのバージョンの問題か?
とにかく、Raspberry Pi Zero 2 wではffmpegだけではやりたいことが実現できない。
そのため、間にv4l2を挟んでstdout経由でH.264データを渡す。
これでうまくいくはず。
解決方法
v4l2でh264に切り替えて録画、その標準出力をパイプでffmpegに繋いでそのまま保存しようという作戦
$ v4l2-ctl -v width=1920,height=1080,pixelformat=H264 --device /dev/video0 $ v4l2-ctl -p 30 --device /dev/video0 $ v4l2-ctl --device /dev/video0 --stream-mmap=3 --stream-to=- | ffmpeg -y -i pipe:0 -c:v copy https://blog.hatena.ne.jp/eeesode/smartphone-zine.hatenablog.com/out0.mp4 &
録画を止めるときは別のターミナルを開いて次のコマンドを実行します。
killall v4l2-ctl
うまくいきました!!ようやく、USBカメラ側のハードウェアエンコードを用いたH264録画が完成です。
ここまで本当に長い道のりでした・・・
2台のUSBカメラで、フルハイビジョン(フルHD)画像を撮影する!形式はデータ量の少ないH264形式!
v4l2-ctl -v width=1920,height=1080,pixelformat=H264 --device /dev/video0 v4l2-ctl -p 30 --device /dev/video0 v4l2-ctl -v width=1920,height=1080,pixelformat=H264 --device /dev/video2 v4l2-ctl -p 30 --device /dev/video2 v4l2-ctl --device /dev/video0 --stream-mmap=3 --stream-to=- | ffmpeg -y -i pipe:0 -c:v copy out0.mp4 & v4l2-ctl --device /dev/video2 --stream-mmap=3 --stream-to=- | ffmpeg -y -i pipe:0 -c:v copy out2.mp4 &
問題なく動作しました!!良かった、これで一歩前進です。
色々試した結果、次のコマンドならffmpegだけでも録画出来ました!!
v4l2-ctl でパイプなんてしなくてもffmpegだけでうまく録画出来たパターンです。
ffmpeg -f v4l2 -input_format h264 -video_size 1920x1080 -framerate 30 -i /dev/video0 -c:v copy tesutout.mp4
今日はここまで。