はじめに
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のようです。
コメント