私が開発してるサービスで動画のエンコードが必要になった時の作業メモです。
ちなみにサーバー環境は Linux 64Bit(Ubuntu 12.04.3 LTS)、さくらサーバーのVPS。
(※Ubuntu16での変更点は追記に記載してます。)
ubuntuにパッケージで用意されているのはffmpegから派生したavconvだったので、当初はパッケージ版のavconv(v0.8.9)をインストールして動画をコンコードするプログラムを書いていました。
といいますか、ubuntuで apt-get install ffmpeg を実行するとffmpegではなくavconvがインストールされます。
ところが、いくつかのタイプの動画をテストでエンコードしてみてわかりましたが、このパッケージ版には不具合があります。
QuickTimeでエンコードされたmovファイル(動画コーディックはmp4)を再エンコードしようとすると Floating point exception というエラーが出て止まってしまいます。
既にプログラムはavconv用に書いていたので、気を取り直してソースから最新版のavconv(v0.9.10)をビルドしてみました。
すると、先ほどのmovファイルの再エンコードではエラーは出なくなりましたが、今度は別のwmvファイルを再エンコードしようとすると、
Application provided invalid, non monotonically increasing dts to muxer in stream 1: 13568 >= 13024
av_interleaved_write_frame(): Invalid argument
というエラーが出て止まります。
v0.8.9のソースからビルドすると、上記2つの動画は正常にエンコード出来るようになりましたが、古いバージョンを使うというのは気持ち的にあまり嬉しくありません。
そこでavconvは諦め、本家ffmpegに回帰することにしました。
ソースから ffmpeg v8.90 + libx264 + libvpx + FDK-AAC をビルドして、上記の二つの動画も問題なくエンコードできる事を確認。
オプションの挙動がavconvと若干異なっているのでプログラム側を微調整。
avconvは -movflags faststart に対応してないようでqt-faststartを後から実行する必要がありましたが、ffmpegではオプション一発で済むので楽ちんです。
また、動画フィルターとサイズ指定オプションの実行される順番なども異なってるようです。
以下、ffmpegをインストールした時の作業メモ。
【yasm】
ubuntuのyasmが1.1系でx264のビルドには1.2系が必要なので、先にインストール。
http://yasm.tortall.net/Download.html
./configure make make install
【FDK-AAC】
http://sourceforge.net/projects/opencore-amr/files/fdk-aac/
tar xzvf fdk-aac-0.1.*.tar.gz cd fdk-aac-0.1.* ./configure --prefix=/usr/local make make install-strip
もし、 ./libtool: line 1125: g++: command not found の等エラーが出たら
apt-get install g++ でg++をインストール。
【libx264】
http://www.videolan.org/developers/x264.html
git clone git://git.videolan.org/x264 cd x264 ./configure --prefix=/usr/local --enable-shared --enable-pic --extra-cflags=-fPIC --extra-ldflags=-fPIC --extra-rcflags=-fPIC --enable-strip make make install
【libvpx(WebM VP8/VP9 Codec SDK)】
git clone --depth 1 http://git.chromium.org/webm/libvpx.git (※下に追記あり) cd libvpx ./configure --prefix=/usr/local --disable-examples make make install ldconfig
【ffmpeg】
git clone git://source.ffmpeg.org/ffmpeg.git cd ffmpeg ./configure \ --prefix=/usr/local \ --libdir=/usr/local \ --shlibdir=/usr/local \ --incdir=/usr/local \ --mandir=/usr/local \ --arch=x86_64 \ --disable-debug \ --extra-cflags="-s -O3 -mtune=native -march=native" \ --enable-gpl \ --enable-nonfree \ --enable-libfdk-aac \ --enable-libvpx \ --enable-libx264 make make install ldconfig
- 結局のことろ、本家公式サイトが一番参考になりました。
https://trac.ffmpeg.org/wiki/UbuntuCompilationGuide - AACエンコーダーはNeroAACCodecが最も音質がいいらしいですが、ffmpegへは組み込めず外部プログラムを呼び出す形になるため、次点のFDK-AACでいいかなと。
#追記 2016/10/13
Ubuntu 16.04 LTS にインストールしてみました。
基本的には上記のままで大丈夫でした。
yasm は1.3系がパッケージに含まれているのでapt-getでいけます。
apt-get install yasm
libvpxのレポジトリが移転してました。
git clone https://chromium.googlesource.com/webm/libvpx
FDK-AACの高音質が欲しくてソースからビルドしてみましたが、そこまでこだわりが無ければ、Ubuntu16の標準パッケージで全然問題ないかも・・・。