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を付けてほぼ同等って所でした。
まとめ
ffmpeg最新版、色々バグが取れてて正しいと思うんだけど、過去バージョンの時にそのバグをうまいことパラメータで調整してたのが裏目ってドイヒーだった
— すぎもと (@sugimoto1981) 2016, 1月 22
もうやりたくない。 けどまた1年後とかせこせこコンパイルしてるような気がしてならない。
現場からは以上です。