Raspberry Pi Zero 2 w に、ffmpegをインストールしてUSBカメラのチェックを行う
ドラレコ用に購入したカメラを使って録画できるか試してみる。ドラレコには前方と後方、2台のカメラを使う。
目的:
- ffmpegで動画コーデックがH.264であるmp4の動画で記録したい。
- カメラはUSBカメラを使いたい
- 使用するカメラがH.264エンコード対応しているので、ラズパイ側のハードウェアエンコードやソフトウェアエンコードを使わないようにしたい。
- 2台のカメラを同時録画したい
結果:
- v4l2-ctl というソフトで、H.264の生データで録画可能。
- ffmpegでV4L2経由でカメラでH264エンコードしたデータをmp4保存する、ということはできなかった。ffmpegがKilledで停止してしまう。
試したこと
ラズパイを最新の状態にします
$ sudo apt update
$ sudo apt upgrade
ffmpegのインストール
sudo apt install ffmpeg
カメラの情報を表示します
$ v4l2-ctl --list-devices bcm2835-codec-decode (platform:bcm2835-codec): /dev/video10 /dev/video11 /dev/video12 /dev/video18 /dev/video31 /dev/media0 bcm2835-isp (platform:bcm2835-isp): /dev/video13 /dev/video14 /dev/video15 /dev/video16 /dev/video20 /dev/video21 /dev/video22 /dev/video23 /dev/media1 /dev/media2 CS-USB-IMX307: UVC Camera (usb-3f980000.usb-1.2): /dev/video0 /dev/video1 /dev/media3 CS-USB-IMX307: UVC Camera (usb-3f980000.usb-1.4): /dev/video2 /dev/video3 /dev/media4
2台カメラが接続されているので、デバイスを指定して対応解像度を表示してみます。
$ v4l2-ctl --device /dev/video0 --list-formats-ext ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: 'YUYV' (YUYV 4:2:2) Size: Discrete 640x360 Interval: Discrete 0.033s (30.000 fps) [1]: 'MJPG' (Motion-JPEG, compressed) Size: Discrete 640x360 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.017s (60.000 fps) Size: Discrete1920x1080 Interval: Discrete 0.033s (30.000 fps) [2]: 'H264' (H.264, compressed) Size: Discrete 640x360 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.017s (60.000 fps) Size: Discrete 1920x1080 Interval: Discrete 0.033s (30.000 fps)
録画に使うツールをインストールします。
$ sudo apt install -y ffmpeg
このカメラは、H.264にも対応しています。
Data fromat : YUY2 / MJPG / H.264
smartphone-zine.hatenablog.com
v4l2を使って、カメラの設定を変更します。
$ 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 -V --device /dev/video0 Format Video Capture: Width/Height : 1920/1080 Pixel Format : 'H264' (H.264) Field : None Bytes per Line : 3840 Size Image : 4147200 Colorspace : sRGB Transfer Function : Rec. 709 YCbCr/HSV Encoding: ITU-R 601 Quantization : Default (maps to Full Range) Flags : $ v4l2-ctl -V --device /dev/video2 Format Video Capture: Width/Height : 1920/1080 Pixel Format : 'H264' (H.264) Field : None Bytes per Line : 3840 Size Image : 4147200 Colorspace : sRGB Transfer Function : Rec. 709 YCbCr/HSV Encoding: ITU-R 601 Quantization : Default (maps to Full Range) Flags :
入力フォーマットにh264を指定(カメラ側でエンコードさせて、ラズパイの負荷を下げる)
ffmpeg -i /dev/video0 -input_format h264 -c:v copy testshot.mp4
うまういかない。
v4l2-ctl -v width=1920,height=1080,pixelformat=H264 v4l2-ctl -p 30 v4l2-ctl --stream-mmap=3 --stream-count=300 --stream-to=testrec.raw
これはうまくいった。画像もちゃんと撮れてる。
CPUの監視インストール
sudo pip install s-tui
実行
s-tui
ファイルのフォーマット確認
mediainfo ファイル名
ffmpegがKilledになる
どうしても、-input_format h264したものを-c:v copy して保存することができない。Killedと表示されて止まってしまう。
そのため、一度v4l2-ctlで、生のh264ファイルとして保存する。stream-count=1800とすると約1分のファイルができる。
v4l2-ctl -v width=1920,height=1080,pixelformat=H264 v4l2-ctl -p 30 v4l2-ctl --stream-mmap=3 --stream-count=1800 --stream-to=video0.raw --device /dev/video0
後からffmpegでmp4ファイルに変換する。
ffmpeg -i testrec.raw -c:v copy -y -f mp4 out2.mp4
とりあえず、生のH264ファイルでもVLCなどのプレイヤーで見ることができるので、ドラレコとしてはH264保存で十分。
色々試すがどれももうまく行かない
ffmpeg -input_format h264 -s 1280x720 -r 60 -i /dev/video0 -c:v copy testshot.mp4