All Articles

ffmpeg最新版n2.8.5をソースからビルドする話(つらい)

ffmpegを使った機能を実装していて、ようやっと完成させてほっとしたと思いきやhttp://jvn.jp/vu/JVNVU92302510/に報告が。

旧バージョンのffmpegにも脆弱性があるようで、これはマズイですね、と対策方法を見ると、

_人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人_
> 開発者が提供する情報をもとに、最新版へアップデートしてください <
 ̄YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY ̄

つらい。

というわけで、最新版(githubで2.8.5)をインストールする必要があるとのこと。ということは当然ソースからインストールする必要があるわけで…ご存知の通りめっちゃめんどくさいですよね。なので、

以前の記事 で書いたような、yumで入れた時と同じようなコンパイルオプションでビルドできるように頑張ったログです。

環境はECSで稼働させるCentOS6 on Docker。並行してVagrant上のCentOS6のboxでも検証環境として準備しました。ビルドして捨てて、ができるDockerfileだったのはまだ救いだったかもしれません。では手順です。

リポジトリの追加とソースの取得

まずはffmpeg公式サイトにあるrpmfusionを追加。

yum -y localinstall --nogpgcheck http://download1.rpmfusion.org/free/el/updates/6/i386/rpmfusion-free-release-6-1.noarch.rpm http://download1.rpmfusion.org/nonfree/el/updates/6/i386/rpmfusion-nonfree-release-6-1.noarch.rpm

ちなみにこのパッケージを入れた状態で yum install ffmpeg ってやると0.10.15とか入るんですがなんなのこれ。

ともあれ最新版が欲しいので、ソースはGithubのReleaseから取ってきて解凍。

wget https://github.com/FFmpeg/FFmpeg/archive/n2.8.5.tar.gz

コンパイル

目標のコンパイルオプション。コーデック少なめですかね。 実際には使わないコーデックもあるだろうけど、一応現状動作している2.2.1と同じコンパイルオプションを使います。

./configure --prefix=/usr/local --disable-yasm --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --enable-runtime-cpudetect --enable-gpl --enable-version3 --enable-postproc --enable-avfilter --enable-pthreads --enable-x11grab --enable-vdpau --disable-avisynth --enable-libopencv --enable-libdc1394 --enable-libmp3lame --enable-libopenjpeg --enable-libspeex —enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --extra-cflags='-O2 -g -pipe -Wall -Wpundefined-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --disable-stripping

実行しては足りてないエラーを見て都度準備して…の繰り返しで、最終的に入れたパッケージは下記。

yum -y install lame-devel opencv-devel openjpeg-devel librtmp-devel speex-devel libtheora-devel libvorbis-devel libvpx-devel librtmp-devel x264-devel xvidcore-devel libdc1394-devel libxcb-devel

いくつかはrpmfusionから入るものもあるっぽいので、Repoは追加しておいた方がいいかも(なお、rpmfusionを追加してない場合の実行は未検証です…)あとDocker用のCentOSなのでgccやらそういうのも入れてますが省略。

※なぜかlibrtmpだけは同じようにやっても、Docker内ではpkg-configで見つけられない旨のエラーが出てコンパイル出来ませんでした。Vagrantの方では上手くいく。使わないだろうと思って原因は調べず、とりあえず放置しています…。

ここまで来たらコンパイルしましょう!

make && sudo make install

果てなきコンパイルの先に…

$ ffmpeg
ffmpeg version 2.8.5 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-16)
  configuration: --prefix=/usr/local --disable-yasm --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --enable-runtime-cpudetect --enable-gpl --enable-version3 --enable-postproc --enable-avfilter --enable-pthreads --enable-x11grab --enable-vdpau --disable-avisynth --enable-libopencv --enable-libdc1394 --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --extra-cflags='-O2 -g -pipe -Wall -Wpundefined-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --disable-stripping
  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
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help orundefined even betterundefined run 'man ffmpeg'

きたー!最新版がビルドできました!

一日で何回コンパイルしただろうか、、、しかもめっちゃ時間かかるし、、、もうほんとにffmpeg周りしんどい。 しかしながらセキュリティの問題もあるので、最新版に上げる方の参考になれば。

実際は必要なコーデックのみを選択するのがいいと思います。私はx264とかだけを有効にしました。

ハマったバグ(というか正しい挙動) vs 2.2.1

いくつかバグFIXされている影響か、既存のバージョンと比べて挙動が変わっている部分があったのでメモ程度に。なおリリースノートは見てないです。

  • サムネイルを切り出すのに-frames:v 1とかやるけど、出力ファイルにpngが指定できなくなった(2.2.1は出来てた)。--enable-encoder=pngを指定してもダメだった。
  • サムネイルが回転角に関わらず正位置で切り出すようになった。
  • リサイズエンコードをするとアスペクト比が逆転する現象が起きた。DAR 16:9の入力ファイルに対してエンコード後のDARは9:16になっていた。なんでだ。動画入力の解析ロジックが改善されたからなのかもしれない。
  • 総じて、スマフォで撮影した動画の扱いが面倒になった印象(大抵正位置で変換とかしてくれるけど、ところどころに回転角(rotateプロパティ)の値を使ってほげほげして何とかする箇所もあった。
  • h264エンコードが遅くなった(preset指定なしのデフォルトで)。2.2.1と比べると、-preset varyfastを付けてほぼ同等って所でした。

まとめ

もうやりたくない。 けどまた1年後とかせこせこコンパイルしてるような気がしてならない。

現場からは以上です。