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の真価が発揮できそう

 



以上。