Raspberry Pi 4Bで4Kカメラは扱えるか?エンコード性能を徹底検証

スマートホーム
スポンサーリンク

はじめに

2019年6月にRaspberry Pi 4Bが発売され、Raspberry Piの性能は飛躍的に向上しました。動画関係では、フルHD(1920×1080)対応のh264ハードウェアエンコーダを搭載し、CPUに負荷をかけることなく、動画圧縮が可能となっています。

さらに最近では、Raspberry Pi用のHigh Quality Cameraや4Kカメラモジュールが発売され、画像・動画に関するRaspberry Piの用途が拡大しています。

しかし、Raspberry Pi 4Bで4K動画を扱った情報は少なく、実機で試してみたいと分からない状態でした。そこで、今回は、4Kカメラモジュールを入手し、Raspberry Pi 4Bで4K動画をどこまで扱えるか、徹底検証してみました。

検証機材

今回の検証に利用した機材は以下の通りです。

①Raspberry Pi 4B 8GB

今回の検証の中心となるRaspberry Pi(ラズパイ)です。現在発売されている最も高性能な8GBモデルを利用しました。

②4Kカメラモジュール

動画を撮影する4Kのカメラモジュールです。Raspberry PiのCameraコネクタに接続するタイプではなく、USBタイプで、Linuxから扱えるUVCに対応したものです。

エンコード性能を検証

早速、Raspberry Piの性能を検証していきます。ちなみに、今回利用したRaspberry PiのOSは「2020-05-27-raspios-buster」です。

カメラ性能の検証

まずは、購入した4Kカメラの確認&検証を行います。

①USB 4Kカメラの接続確認

Raspberry PiのUSB 3.0ポート(青色の方)にUSBカメラを挿し、接続確認します。今回使用したカメラは以下のように認識されました。 lsusbでは、メーカ名が表示されない😭まあ、認識されているので良し。

root@raspberrypi:/home/pi# dmesg
[  895.020993] usb 1-1.2: Product: HD USB CAMERA
[  895.021006] usb 1-1.2: Manufacturer: 4K USB CAMERA
[  895.021018] usb 1-1.2: SerialNumber: 01.00.00
root@raspberrypi:/home/pi# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 32e4:0317  
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

②v4l2-ctlで確認

UVC接続のUSBカメラは、Linuxでは「v4l2」というドライバを経由して制御します。そこでv4l2経由でカメラの情報を確認します。ちゃんと「HD USB CAMERA: HD USB CAMERA」として/dev/video0と/dev/video1で認識されています。


root@raspberrypi:/etc/motion# v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
	/dev/video10
	/dev/video11
	/dev/video12

bcm2835-isp (platform:bcm2835-isp):
	/dev/video13
	/dev/video14
	/dev/video15
	/dev/video16

HD USB CAMERA: HD USB CAMERA (usb-0000:01:00.0-1.2):
	/dev/video0
	/dev/video1

③対応フォーマットの確認

次に、カメラが対応している動画フォーマットを確認します。今回使用したカメラの対応フォーマットは以下の通りでした。4Kカメラだけに、4K(3840×2160)はもちろん、フルHD(1920×1080)等にも対応しています。また、フォーマットは「’MJPG’ (Motion-JPEG, compressed)」と「’YUYV’ (YUYV 4:2:2)」に対応しています。

root@raspberrypi:/etc/motion# v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
	Type: Video Capture

	[0]: 'MJPG' (Motion-JPEG, compressed)
		Size: Discrete 3840x2160
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1920x1080
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 2592x1944
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 2048x1536
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1600x1200
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1280x960
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1024x768
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x600
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 640x480
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
	[1]: 'YUYV' (YUYV 4:2:2)
		Size: Discrete 3840x2160
			Interval: Discrete 1.000s (1.000 fps)
		Size: Discrete 1920x1080
			Interval: Discrete 0.333s (3.000 fps)
		Size: Discrete 2592x1944
			Interval: Discrete 1.000s (1.000 fps)
		Size: Discrete 2048x1536
			Interval: Discrete 0.333s (3.000 fps)
		Size: Discrete 1600x1200
			Interval: Discrete 0.333s (3.000 fps)
		Size: Discrete 1280x960
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1024x768
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x600
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 640x480
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)

④カメラ性能の検証

それでは、カメラ性能について検証していきます。この検証は、単純にカメラから4Kのデータが取得できるかというもので、いわばUSB3.0ポートの性能検証の意味合いです。

■フルHD(1920×1080)での検証結果

30fps程度のフレームレートが出ており、問題なし!

root@raspberrypi:/etc/motion# v4l2-ctl --set-fmt-video=width=1280,height=720,pixelformat=0
root@raspberrypi:/etc/motion# v4l2-ctl -p 30
Frame rate set to 30.000 fps
root@raspberrypi:/etc/motion# v4l2-ctl --stream-mmap=3 --stream-count=300
<<<<<<<<<<<<<<<<<<<<< 19.92 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 25.00 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 26.75 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 27.58 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.08 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.42 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.66 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.83 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.10 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.10 fps

■4K(3840×2160)での検証結果

4Kでもちゃんと30fps程度のフレームレートが出ており、問題なし!この辺りがUSB 3.0対応のRaspberry Pi 4Bの実力の凄さかと思います。

root@raspberrypi:/etc/motion# v4l2-ctl --set-fmt-video=width=3840,height=2160,pixelformat=0
root@raspberrypi:/etc/motion# v4l2-ctl -p 30
Frame rate set to 30.000 fps
root@raspberrypi:/etc/motion# v4l2-ctl --stream-mmap=3 --stream-count=300
<<<<<<<<<<<<<<<<<<<<< 19.92 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 25.00 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 26.75 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 27.58 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.08 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.42 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.66 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 28.84 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.10 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.10 fps
<<<<<<<<

以上でカメラ性能の検証は完了です!!結論は問題なし!ということで、Raspberry Pi 4Bでは4Kカメラの動画を取得して、それを画面に表示することは問題なく(30fpsでは)できます

エンコード性能の検証

次にエンコード性能の検証を行います。4K動画のデータ量は膨大なので、圧縮無しには、動画の保存もネットワークを介した送信も大変です。なので、4K動画を本質的に扱うためには、エンコードできないと使えません。

①エンコード性能の検証方法

今回は、ffmpegを用いて、4Kカメラで撮影した動画をSDカード内に保存する処理で検証します。また、エンコードは、h264、mjpeg、copy(非圧縮)の3種類の比較を行います。CPUの温度、周波数、使用率は「s-tui」を使用して測定しています。以下の結果は、動画の保存を開始し、fpsの値が落ち着いて来た時点をベースに測定しています。

②フルHD動画の測定結果

4K動画の前に、まずはフルHD動画の測定結果からです。

■フルHD(1920×1080)h264_omx(ハードウェアエンコード)

Raspberry Pi 4Bに搭載されたハードウェアエンコーダを利用したh264動画圧縮の測定結果です。ハードウェアエンコードが効いて、CPUをほとんど使わず、fps=28が出ています。

 fps=28
 CPU=21.9%

$ffmpeg -ss 5 -f v4l2 -input_format mjpeg -s 1920x1080 -i /dev/video0 -c:v h264_omx -framerate 30 -threads 1 /var/lib/motion/output.mp4
---省略---
frame= 3722 fps= 28 q=-0.0 size=    2816kB time=00:02:04.03 bitrate= 186.0kbits/s dup=2941 drop=0 speed=0.939x

■フルHD (1920×1080)h264(1CPU)

Raspberry Pi 4BのCPU(1個)を使ったh264動画圧縮(ソフトウェアエンコード)の測定結果です。fps=4.4という結果となり、実用的ではありません。

 fps=4.4
 CPU=26.0%

$ffmpeg -ss 5 -f v4l2 -input_format mjpeg -s 1920x1080 -i /dev/video0 -c:v h264 -framerate 30 -threads 1 /var/lib/motion/output.mp4
---省略---
frame=  542 fps=4.4 q=29.0 size=    5120kB time=00:00:18.90 bitrate=2219.2kbits/s dup=457 drop=0 speed=0.153x

■フルHD(1920×1080)h264(4CPU)

Raspberry Pi 4BのCPU(4個)をフルに使ったh264動画圧縮(ソフトウェアエンコード)の測定結果です。fps=15という結果となり、テレビ会議は辛いですが、防犯カメラ程度であれば十分かもしれません。

 fps=15
 CPU=79.0%

$ffmpeg -ss 5 -f v4l2 -input_format mjpeg -s 1920x1080 -i /dev/video0 -c:v h264 -framerate 30 -threads 4 /var/lib/motion/output.mp4
---省略---
frame= 2970 fps= 15 q=-1.0 Lsize=   14493kB time=00:01:38.93 bitrate=1200.1kbits/s dup=2800 drop=0 speed=0.496x

■フルHD(1920×1080) mjpeg(4CPU)

Raspberry Pi 4BのCPU(4個)をフルに使ったmjpeg動画圧縮(ソフトウェアエンコード)の測定結果です。fps=29という結果となり、十分です。ただし、h264と比較して8倍のデータ量となります。

 fps=29
 CPU=62.6%

$ffmpeg -ss 5 -f v4l2 -input_format mjpeg -s 1920x1080 -i /dev/video0 -c:v mjpeg -framerate 30 -threads 4 /var/lib/motion/output.mp4
---省略---
frame= 2371 fps= 29 q=24.8 Lsize=   96077kB time=00:01:19.03 bitrate=9958.6kbits/s dup=22 drop=5 speed=0.961x

■フルHD(1920×1080) copy(4CPU)

Raspberry Pi 4BのCPU(1個)を使った無圧縮の測定結果です。単にファイルに書き込んでいるだけなので、CPUもほどんど使わず、fps=30という結果ですね。ただし、ビットレートは36,031kbits/sとなり膨大なデータ量となります。

 fps=30
 CPU=5.1%

$ffmpeg -ss 5 -f v4l2 -input_format mjpeg -s 1920x1080 -i /dev/video0 -c:v copy -framerate 30 -threads 1 /var/lib/motion/output.mp4
---省略---
frame= 1740 fps= 30 q=-1.0 Lsize=  245535kB time=00:00:55.82 bitrate=36031.9kbits/s speed=0.948x

③4K動画の測定結果

いよいよ本題の4K動画の測定結果です。

■4K(3840×2160)h264(1CPU)

Raspberry Pi 4BのCPU(1個)を使ったh264動画圧縮(ソフトウェアエンコード)の測定結果です。fps=1.0という結果となり、まったく使い物になりません。

 fps=1.0
 CPU=25.5%

$ffmpeg -ss 5 -f v4l2 -input_format mjpeg -s 3840x2160 -i /dev/video0 -c:v h264 -framerate 30 -threads 1 /var/lib/motion/output.mp4
---省略---
frame=  167 fps=1.0 q=29.0 size=    4608kB time=00:00:04.16 bitrate=9059.6kbits/s dup=137 drop=0 speed=0.025x

■4K(3840×2160)h264(4CPU)

Raspberry Pi 4BのCPU(4個)をフルに使ったh264動画圧縮(ソフトウェアエンコード)の測定結果です。fps=3.6という結果となり、はやりRaspberry Piでは4K動画をh264で扱うのは厳しいです。

 fps=3.6
 CPU=84.5%

$ffmpeg -ss 5 -f v4l2 -input_format mjpeg -s 3840x2160 -i /dev/video0 -c:v h264 -framerate 30 -threads 4 /var/lib/motion/output.mp4
---省略---
frame=  785 fps=3.6 q=29.0 size=    7168kB time=00:00:24.53 bitrate=2393.5kbits/s dup=749 drop=0 speed=0.114x

■4K(3840×2160)mjpeg(4CPU)

Raspberry Pi 4BのCPU(4個)をフルに使ったmjpeg動画圧縮(ソフトウェアエンコード)の測定結果です。fps=15という結果です。CPUを4つフルに使っても、防犯カメラ程度ですね。

 fps=15
 CPU=100%

$ffmpeg -ss 5 -f v4l2 -input_format mjpeg -s 3840x2160 -i /dev/video0 -c:v mjpeg -framerate 30 -threads 4 /var/lib/motion/output.mp4
---省略---
frame= 1097 fps= 15 q=24.8 size=  145408kB time=00:00:36.43 bitrate=32694.8kbits/s dup=1022 drop=0 speed=0.491x 

■4K(3840×2160)copy(1CPU)

Raspberry Pi 4BのCPU(1個)を使った無圧縮の測定結果です。単にファイルに書き込んでいるだけなので、CPUもほどんど使わず、fps=29という結果ですね。ただし、ビットレートは108,306kbits/sとなり、48.6GB/時という膨大なデータ量となります。

 fps=29
 CPU=4.0%

$ffmpeg -ss 5 -f v4l2 -input_format mjpeg -s 3840x2160 -i /dev/video0 -c:v copy -framerate 30 -threads 1 /var/lib/motion/output.mp4
---省略---
frame= 1203 fps= 29 q=-1.0 Lsize=  493871kB time=00:00:37.35 bitrate=108306.1kbits/s speed=0.905x

測定結果サマリー

測定条件を変えながら実機検証した、4K動画とフルHD動画の測定結果のサマリーです。

おわりに

Raspberry Pi 4Bで4K動画がどこまで扱えるか、4Kカメラと実機を使って検証してみました。フルHD動画についてはハードウェアエンコーダが使えるので十分に使えるという結論です。

ただし、4K動画についてはハードウェアエンコーダが対応していないので、CPUを使ったソフトウェアエンコードに頼るしかなく、h264ではCPUを4つを使っても3.6fpsしか出ず、使い物にならないという結論です。動画サイズを妥協してmjpegでも、CPUを4つ使っても15fpsなので他の処理が何もできない状態です。

このため、Raspberry Pi 4Bの性能が良くなったといえども、4K動画を扱うには性能不という結論かと思われます。未来のRaspberry Pi 5B?に期待ですね。

補足:SDカードの書き込み速度がボトルネックになっている可能性も考え、メモリ上に書き込む検証も行いましたが、結果は変わらずボトルネックはCPUのようです。

関連記事

記事が参考になったら、ブログランキングに協力(クリック)して貰えると嬉しいです。

昼間はIT企業に勤めてますが、プライベートでは「育児×家事×IoT」をテーマに家のスマートホーム化に取り組んでいます。Androidアプリも作っているので使って下さい。質問・コメントは、↓のコメント蘭でもFacebookメッセンジャーでもどちらでも大丈夫です。
E-mail:naka.kazz.d@gmail.com

naka-kazzをフォローする
スマートホーム開発者向け
スポンサーリンク
naka-kazzをフォローする
スマートホーム×DIY

コメント