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

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
上部へスクロール