Orange Pi OneでImageMagick/ffmpegは使えるか
Orange Pi Oneで画像(映像)処理系のプログラムが実用的に動作させられるか、簡単な検証を行ってみました。
前提環境
- Armbian導入済
Imagemagick編
ArmbianにはImageMagickは初期導入されていないので、まずインストールする必要があります。
$ sudo apt-get install imagemagick
検証時に導入されたImageMagickのバージョンは以下の通り。
$ convert -version Version: ImageMagick 6.8.9-9 Q16 arm 2016-06-01 http://www.imagemagick.org Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC Features: DPC Modules OpenMP Delegates: bzlib cairo djvu fftw fontconfig freetype jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png rsvg tiff wmf x xml zlib
後はお馴染のconvertコマンドなどが使用可能です。
ImageMagickは多機能ツールであることから、コマンド1発叩くだけでもどのような機能/オプションを利用するかによって、処理の負荷は異なります。
なので、参考程度にしかなりませんが、以下の実験を行いました。
検証内容
以下ようなのコマンドを150回繰り返し、FullHD解像度のランダムノイズ画像を生成。
convert -size 1920x1080 xc:black +noise Random FRM_0001.jpg
⇒所要時間: 1分54秒
ffmpeg編
ffmpegもArmbianには初期導入されていないので、インストールします。
$ sudo apt-get install ffmpeg
検証時に導入されたffmpegのバージョンは以下の通り。
$ ffmpeg -version ffmpeg version 2.8.6-1ubuntu2 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 5.3.1 (Ubuntu/Linaro 5.3.1-11ubuntu1) 20160311 configuration: --prefix=/usr --extra-version=1ubuntu2 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv libavutil 54. 31.100 / 54. 31.100 libavcodec 56. 60.100 / 56. 60.100 libavformat 56. 40.101 / 56. 40.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 40.101 / 5. 40.101 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.101 / 1. 2.101 libpostproc 53. 3.100 / 53. 3.100
なお、Allwinner用のFFmpeg-Cedrusという改造版も存在するようですが、Orange Pi OneのAllwinner H3プロセッサのハードウェアエンコーダには対応していないようですので、試していません。
GitHub - stulluk/FFmpeg-Cedrus: FFMpeg for Cedrus on Allwinner devices with sunxi kernel
State of H.264 encoding support on H3 devices? - Allwinner H3 - Armbian forum
検証内容
ImageMagick編で生成した150枚のFullHD解像度の静止画JPEGから、30fpsで5秒のH.264のFullHD動画にエンコード。
- 試行1例目
ffmpeg -r 30 -i FRM_%04d.jpg -vcodec libx264 -pix_fmt yuv420p -crf 20 -preset slow -tune stillimage Random.mp4
⇒映像制作時に常用しているのに近いオプションで試行したところ、エンコード中にフリーズし、Segmentation faultが発生
- 試行2例目
ffmpeg -r 30 -i FRM_%04d.jpg -vcodec libx264 -pix_fmt yuv420p -crf 25 -preset slow -tune stillimage Random.mp4
⇒CRFを落として(大きくして)、前回施行時より画質落とす設定にして負荷の低減を図ったが、再度フリーズし、今度はコンソールにkilled表示されて異常終了
同コマンド実行中に1秒間隔でiosatatを取得してみると、猛烈な勢いでメモリが消費され枯渇していることが判明。以下、killedに至る直前までのiostatの様子。
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 2 10304 79136 116 15476 0 0 13392 0 1079 1048 59 3 20 19 0 4 2 10304 73568 116 15800 0 0 8548 0 781 812 96 2 1 0 0 5 1 10304 62448 116 18112 0 0 14900 0 1119 1369 68 7 6 19 0 5 2 10304 55324 116 15768 0 0 10488 0 936 1068 66 6 6 22 0 6 2 10304 48648 116 13948 0 0 13680 0 1131 1495 70 7 2 21 0 4 1 10304 43764 116 14084 0 0 4560 0 734 642 95 3 1 1 0 6 0 10304 33808 116 18312 0 0 11600 880 1977 3079 93 5 1 0 0 6 0 10304 31316 116 16756 0 0 3944 0 647 581 96 1 1 1 0 6 0 10304 31068 116 14584 0 0 504 0 507 370 97 1 2 0 0 6 1 10304 28300 116 14716 0 0 6864 0 888 961 88 4 1 6 0 6 0 10304 24504 116 14644 0 0 4904 0 850 865 96 2 0 2 0 6 1 10304 20908 116 14704 0 0 3456 0 654 596 97 1 2 0 0 6 1 10304 17808 116 14792 0 0 2720 0 677 597 99 1 0 0 0 6 1 10304 13592 116 15300 0 0 3964 0 680 614 99 1 0 0 0 6 0 10304 9756 116 16088 0 0 3488 0 654 595 97 2 0 0 0 6 1 10304 4548 116 18104 0 0 8280 880 3092 3014 96 4 0 0 0 7 1 10304 3980 116 16332 0 0 3376 0 625 602 98 2 0 0 0 7 1 10304 4132 116 14852 0 0 1324 0 553 490 99 1 0 0 0 5 4 13680 2932 116 14960 0 3564 7288 3564 56396 110171 25 14 1 60 0
無風時400MB程度の空きメモリがあるのだが、順次食い潰され3MB弱まで空きメモリが減少し、最終的に枯渇に至り殺されている模様。
- 試行3例目
ffmpeg -r 30 -i FRM_%04d.jpg -vcodec libx264 -pix_fmt yuv420p -tune stillimage Random.mp4
⇒さらにpreset slow指定を外し、負荷の低減を図ったところ、正常終了(所要時間未測定ながらも、常用したいと思わない速度)。
終了直後のCPU温度は67℃。
$ cat /sys/devices/virtual/hwmon/hwmon1/temp1_input
67
iostatを取得しながら再実行してみると、ffmpeg実行中の%userが総じて低く、%niceや%iowaitが高く90%台に達している局面もある(以下に一部抜粋)。
09/08/2016 08:44:58 AM avg-cpu: %user %nice %system %iowait %steal %idle 11.44 85.29 1.86 1.11 0.00 0.30 09/08/2016 08:45:03 AM avg-cpu: %user %nice %system %iowait %steal %idle 1.80 93.53 3.41 0.85 0.00 0.40 09/08/2016 08:45:08 AM avg-cpu: %user %nice %system %iowait %steal %idle 0.00 45.55 1.96 52.24 0.00 0.25 09/08/2016 08:45:13 AM avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 5.34 94.66 0.00 0.00 09/08/2016 08:45:18 AM avg-cpu: %user %nice %system %iowait %steal %idle 0.05 3.41 14.94 73.99 0.00 7.60
%userについては25%を越えていることが無く、せっかくのQuadcoreプロセッサなのにシングルスレッドで動作している模様。
-threads 4オプションを指定したところ、30%台に上昇することがあるものの、iowaitの比率が高くほとんど高速化に寄与しない。
iowaitは内蔵microSDのアクセス集中によるものと判断できる。I/O分散を図るにはUSB2.0経由でストレージを接続するか、NASをマウントするか位しか思い当たらず、シングルボードコンピュータでそこまでやる意味が解らないので試していない。
%niceが高いのは何が起きているのかよく解らず。
まとめと雑感
- センサデータを可視化する用途などにImageMagickを使うのは実用的なパフォーマンスが得られそう
- 動画エンコードではプロセッサパワーに対してI/Oが貧弱で先に逼迫してしまう
- ffmpegはOrangePiOneで走らせるメリットが特に無い
- 低解像度・低フレームレート(インプットデータボリュームが少ない)の小さな映像を生成するのなら実用になるかもしれない
- Inputデータは少ないが計算量はそこそこ多いような用途でOrangePiOneの真価が発揮できそう
以上。