はじめに
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では、メーカ名が表示されない😭まあ、認識されているので良し。
1 2 3 4 5 |
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 |
1 2 3 4 5 6 |
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で認識されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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)」に対応しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
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程度のフレームレートが出ており、問題なし!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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の実力の凄さかと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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%
1 2 3 4 |
$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%
1 2 3 4 |
$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%
1 2 3 4 |
$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%
1 2 3 4 |
$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%
1 2 3 4 |
$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%
1 2 3 4 |
$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%
1 2 3 |
$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%
1 2 3 |
$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%
1 2 3 |
$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のようです。
コメント