Raspberry Pi Zero 2 w に、ffmpegをインストールしてカメラのチェックを行う その3(解決編)

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

今日はここまで。

上部へスクロール