iPhone用動画に使うFFmpegにはキマリがある

録画した.tsファイルをiPhone用動画に変換するときは、以前書いたBonTsDemuxを使っています。

これと連携するFFmpegをどうにか新しくしたら、より速くなるのでは?と思って過去何度か入れ替えを試しました。でもエラーですぐエンコードが終わってしまい途方に暮れていました。そこで調べてみると条件があることが判明。

結論:
FFmpegはlibfaacを含めてビルドされた古いVersionが必要

iOSデバイス用動画ではAACというがオーディオコーデックが使われます。それを扱うにはlibfaacというライブラリを含めてFFFFmpegをビルド(生成)する必要がありますが、ある時期からlibfaacを含めた状態で配布する事が禁止されました。その為、今各所で公開されている新しいFFmpegには入っていない=エラーになると。

なるほど納得。

それをふまえて、FFmpegをVersionUpするには3つの手段を考えました。

・新しいaacコーデックを使う

vo-aacencのコンパイル&インストールによると、多少機能は劣るものの別のフリーAACエンコーダを含めてあるそうです。このビルドでならAACがエンコードに使えるみたい。実際core2最適化版を使い、変換パラメータを”-acodec libvo_aacenc”にしたら無事エンコードできました。
ただ公開者曰く、内蔵AACコーデックは音質的にlibfaacに劣るとの事。

・含まれている古いFFmpegを使う

FFmpeg rev.18607までであれば、libfaacを内包したバージョンを配布できるようです。ダウンロードはFFmpeg rev.18607 ダウンロードにて。
→(2013/09/04追記)古くてもダメなようで配布中止されていました。

・自分でリビルドする

配布はできなくとも、libfaac単体でダウンロードする事はまだ可能です。これに最新のFFmpegのSourceを組み合わせてリビルドすれば・・・。Cygwinとか結構手間な様なので、この点は見送り。

結局libfaacが使える一番最後の最適化版FFmpegを使うのが一番無難かなぁ、という結論に達しました。まぁ改めてCore2最適化版の速度を測ってみたのですが…正直誤差の範囲しか変わらなかったorz

それよりも今回の課程でパラメータを見直した効果のほうが効果を感じました。実コア数を指定するより、-threads 0とした方が最大限多くのコアを使ってエンコードしてくれる様です。

最後に今のcap_sts_sea.ini

X264_HIGH_WXGA    =-f mp4 -threads 0 -vcodec libx264 -vpre "./libx264-hq.ffpreset" -aspect 16:9 -s 1440x1080 -b 1200000 -acodec libfaac -ar 48000 -ab 96000 -y
X264_HIGH_WXGA_EXT    =avi

iPhone		=-s 432x320 -threads 0 -aspect 16:9 -vcodec libx264 -b 768k -crf 23.0 -level 30 -qmin 10 -acodec libfaac -ab 128k -ac 2 -ar 48000 -f mp4 -r 29.97 -y 
iPhone_EXT	=mp4

iPad		=-s 1024x758 -aspect 16:9 -threads 0 -vcodec libx264 -b 2000k -crf 23.0 -level 30 -qmin 10 -acodec libfaac -ab 128k -ac 2 -ar 48000 -f mp4 -r 29.97 -y 
iPad_EXT	=mp4