2011年11月8日火曜日

FFmpegとMacPorts

動画変換最強プログラムのffmpeg(巷のGUI動画変換アプリも中身はffmpegのコマンドラインを作っているだけだったりする)だけれど、Lion 10.7.2 + Xcode 4.2では、MacPorts版がコンパイルできない。

LLVM GCCではMMX関係のマクロの展開に失敗しているような感じで、未解決のシンボルがどうのといって止まってしまう。

困っていたのだが、検索してみたところ、configure時に--cc=clangオプションをつけて、clangでコンパイルすればよいという説明があり、試してみたら成功した。

おそらく、コマンドラインはこんな感じだと思う。
port install ffmpeg-devel configure.cc=clang
僕は、最新版のGitリポジトリから入れた。とはいえ、依存ライブラリから全部自前では面倒なので、いったん普通にportでffmpegを入れようとして、依存ライブラリが全て入ったところでffmpegのconfigureに失敗するところから始めた。

まず、
port clean ffmpeg
したあと、適当なディレクトリに
git clone git://git.videolan.org/ffmpeg.git
して最新のソースツリーを取得し、そのあとでMacPortsが与えるオプションを用いてconfigureを実行する。

ただ、気のせいかどうかわからないけれど、gitの結果できるffmpegディレクトリのなかに再びffmpegディレクトリがあったような気がするので、あれば消しておく必要がある(実行ファイル名とディレクトリ名がぶつかり、エラーになるから)。.gitignoreにffmpegと書いてあるので、次回のpull時に復活する可能性はないはず。

与えたオプションは以下の通り。
./configure --prefix=/opt/local --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libxvid --enable-libx264 --enable-libvpx --enable-libspeex --mandir=/opt/local/share/man --enable-shared --enable-pthreads --extra-ldflags="-L/opt/local/lib" --extra-cflags="-I/opt/local/include" --enable-version3 --arch=x86_64 --cpu=x86_64 --cc=clang
あとは、make && make installすれば/opt/local/bin以下にffmpeg関係のバイナリが入る。

MacPortsのffmpeg-develはまだsvnのリポジトリを参照しているようで、まだ0.7あたりのようだ。gitのほうは、すでに0.8は終わってその次になっているので、gitからビルドしたほうが、より高速で高機能かつ高画質なバイナリが得られるはず。ffmpeg-develリストを読む限り、少なくともMacに関しては、「VDA (Video Decode Acceleration Framework)」が最近入ったので、H.264のデコードがGPUによって行われる分、変換が高速になるはず。また、DCTのテーブルも調整されているので、画質向上も図られていると思われる。

なお、MacPortsで入っているx264が古いためか、MP4にエンコードする際にCPUのもつMMX等のスーパースケーラー機能がないと勘違いし、ひどく遅くなる。x264もGitで最新版にしておく必要があるようだ。
git clone git://git.videolan.org/x264.git
configureのオプションは、MacPortsにしたがって、
./configure --prefix=/opt/local --enable-pic --enable-shared
としておいた。make && make install後、ffmpegを再度ビルドしなおせば、例えばCore2Duoの場合なら
[libx264 @ 0x7fee9a0bc800] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.1 Cache64
のように、きちんとCPUに装備されている並列計算機能を利用してくれる。失敗した場合は、この表示が「none!」になってしまう。