matoken?

  • KenichiroMATOHARA( @matoken )

  • http://matoken.org

  • 興味

    • PC-UNIX/OSS, OpenStreetMap, 電子工作, 自転車……

    • altanativeが好き,多様性は正義!

大隅から来ました

最近

ライブストリーミング

  • たまにOSMマッピング配信を

    • JOSMをOBSでYoutubeLiveに配信していた

  • Core i7-2620M や Core i7-640LM

  • 現在 Core2Duo P8400

    • エンコード遅い……

    • NotePCなのでGPU増設できない

Raspberry Piにh.264のハードウェアエンコーダがついてる

  • $5〜$35でお安い

  • 標準では標準カメラの入力がハードウェアエンコーディング出来る

  • デスクトップやUSBカメラはそのままでは不可

  • 今回は Raspberry Pi 2 B を利用

ffmpegのPi関連らしいconfigure option

$ ./configure --help|grep -i raspberry
  --enable-mmal            enable Broadcom Multi-Media Abstraction Layer (Raspberry Pi) via MMAL [no]
  --enable-omx-rpi         enable OpenMAX IL code for Raspberry Pi [no]
$ ./configure --help|grep -i arm
  --disable-armv5te        disable armv5te optimizations
  --disable-armv6          disable armv6 optimizations
  --disable-armv6t2        disable armv6t2 optimizations

Raspbian stretchのffmpeg configure

  • --disable-armv5te は入っているけど--enable-mmal/--enable-omx-rpiは無い

  • configure optionを追加してbuildし直す

ffmpeg version 3.2.5-1 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 6.3.0 (Raspbian 6.3.0-18+rpi1) 20170516
  configuration: --prefix=/usr --extra-version=1 --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --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-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared

必要パッケージの導入

$ sudo apt update # パッケージ情報更新
$ sudo apt upgrade # パッケージを最新に
$ sudo apt install build-essential devscripts # 開発環境導入
$ sudo apt build-dep ffmpeg # ffmpeg関連パッケージ導入

source入手

$ apt source ffmpeg # source pkg入手
$ cd ffmpeg-3.2.5
$ vi debian/rules # configure option等編集

debian/rules変更部分

@@ -86,6 +86,8 @@
--enable-libzmq \
--enable-libzvbi \
--enable-omx \
+       --enalbe-omx-rpi \
+       --enable-mmal \
--enable-openal \
--enable-opengl \
--enable-sdl2

dpkg-buildpackage -us -uc -b

time
real    336m37.830s
user    376m25.670s
sys     34m12.060s

並列処理忘れたとはいえ遅い……

Rpi3の事例

$ make -j4
コンパイルは30分くらいかかった。 その際に CPU の発熱がすごくて温度警告がでる(初めて見た!)。 温度警告は 80~85℃ で出て 85℃ を超えるとクロックが落ちるらしい。 速く安全に終わらせたいならヒートシンクを付けるなどの熱対策が要る。 自分は放熱できるケースを買っておいたのでそれに入れ替えた。

ちょっとmakeし直してみる

$ make clean
$ time ./configure (略
$ time make -j4

結果

  • configure : 5m50.275s

  • make -j4 : 92m19.943s

MURAOKAさんのRPI3の3倍くらい…… 多分CPUだけでなくSDも足を引っ張っている(一応SunDisk Class10)

Raspberry Pi 3 BかRaspberry Pi 2 B 1.2と速いストレージ欲しい

ffmpeg少し試す

  • とりあえずUSBカメラ(ハードオフで500円ほどで入手したLogitech c270)

  • encode optionはffmpeg wikiのstreaming例の適当なものなの

  • IOやNetworkが遅そうなのでとりあえず宛先は /dev/null に

  • video codec h264_omx がキモ

$ /opt/bin/ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 -c:v h264_omx -preset veryfast -maxrate 1984k -bufsize 3968k -vf "format=yuv420p" -g 60 -f null -

解像度だけ変えて何パターンか

1920x1080
frame=  411 fps=6.7 q=-0.0 Lsize=N/A time=00:01:02.93 bitrate=N/A speed=1.02x
video:1429kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
1366x768
frame=  577 fps=9.5 q=-0.0 Lsize=N/A time=00:01:03.20 bitrate=N/A speed=1.04x
video:1410kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
1280x720
frame=  558 fps=9.1 q=-0.0 Lsize=N/A time=00:01:03.30 bitrate=N/A speed=1.04x
video:1366kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
854x480
frame=  878 fps= 15 q=-0.0 Lsize=N/A time=00:01:02.65 bitrate=N/A speed=1.04x
video:1072kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
640x360
frame=  932 fps= 15 q=-0.0 Lsize=N/A time=00:01:04.96 bitrate=N/A speed=1.01x
video:758kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

ソフトウェアエンコーディングと比較してみる

1920x1080
video codec h264     -> ソフトウェア    : 3.8fps(speed=0.875x)
video codec h264_omx -> RPiハードウェア : 6.7fps(speed=1.02x)
  • 思ったほど差がないけどCPUの空きは全然違う

    • ソフトウェアでのvmstat(id) → 0〜20

    • ハードウェアでのvmstat(id) → 95〜100

h264(ソフトウェア)
frame=  295 fps=3.8 q=-1.0 Lsize=N/A time=00:01:07.86 bitrate=N/A speed=0.875x
video:12971kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
h264_omx(ハードウェア)
frame=  411 fps=6.7 q=-0.0 Lsize=N/A time=00:01:02.93 bitrate=N/A speed=1.02x
video:1429kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

色々使えるように

  • これまで

    • Raspberry Pi標準カメラモジュール($25〜)からの入力のみ

  • 今回ので

    • v4l2でUVCなUSBカメラ

    • x11grubでデスクトップ

    • 適当な動画ファイル

    • ネットワーク経由でリモートのカメラやデスクトップをリアルタイムエンコード配信

    • 等々で使えるように

PiCast + UVCとかOBSでの利用とか良さそう

ちなみにGeForce GTX 1080

勉強会中のツッコミ

  • httpsで配信するのであればそっちもボトルネックになるのでは?

    • rtmpsが多いのでSSLの処理はたしかに必要.でもRaspberry Pi 1 B(初代RAM256)でも間に合っていた(VGA 10fpsくらい)ので多分大丈夫

license等