2012年2月9日木曜日

ffmpegとmplayerは自分でコンパイルしよう

MacPortsからffmpeg-develとmplayer-develを入れていても、なかなか更新はかからないのだけれど、実際には、少なくともffmpegは毎日膨大な変更が入っています。それも、とても基本的なところでの修正が多いのです。

だから、ffmpeg-user MLで「〜ができないんですが」的な質問をすると必ず「古すぎる。Git headを使え」という答えがつくことになっているのが実態。

というわけで、みなさんももしffmpegお使いなら、MacPortsはあてにせず、自分でgit headを入れるようにしましょう。

ライブラリまで自分で管理するのは面倒なので、いったんport install ffmpeg-develして、依存関係にあるライブラリはすべて自動で入れてしまいます。そのあと、port uninstall ffmpeg-develしてしまいます。あと、x264もMacPortsで入るバージョンは古い(最新が12に対して10)ので、こちらは上書きインストールすることにします(他で依存関係があって、uninstallするとせっかく入れたものが古いものに上書きされてしまうから)。

まず、x264の最新版を上書きインストールしましょう。ソースはgitで入手します(port install gitしておいてくださいね)。適当なディレクトリを作って(僕は/var/srcというのを作りました)、その下にいろいろ置くことにします。
# git clone git://git.videolan.org/x264.git
# cd x264
# ./configure --prefix=/opt/local --enable-shared
# make install distclean
これで入ります。最新版にするには、
# cd /var/src/x264
# git pull
でできます。そしたら、またconfigure以後の作業をして置き換えます。更新頻度は毎日ではありませんが、最低でも月に2度ぐらいはあるような感じがします。

ffmpegは、なんか開発グループが分裂して、一方はlibavを名乗るようになってしまいました。ffmpeg.orgにどちらのリポジトリも掲載されているので、好きな方を使ってください。僕は本家を入れています。
# cd /var/src
# git clone git://source.ffmpeg.org/ffmpeg.git
これでソースが手に入りました。次にconfigureするわけですが、オプションの指定が必要です。最低でもどれだけ必要かは、

/opt/local/var/macports/sources/rsync.macports.org/release/ports/multimedia/ffmpeg-devel/Portfile

に書いてあります。

まぁ、
configure.args \
        --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=${prefix}/share/man \
        --enable-shared --enable-pthreads \
        --cc=${configure.cc}
こんなことが書いてあるので、そのままパクることにします。で、最後のccですが、Xcode 3.6の人は無視、Xcode 4以上の人はclangを指定します。

毎回手で入れるのは面倒なので、shell scriptにしておくといいでしょう。
#!/bin/sh
./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
こんな感じでしょうかねぇ。

もし、MP4ファイルを作る人で、音声のAACをffmpeg内蔵の実験コードではなく、実績のあるlibfaacを使いたい人は、
# port install faac
しておき、configureのオプションに--enable-libfaacを入れてください。AAC HEをやりたい物好きな人は、最近ffmpegにも実験コードが入りましたが、以下
http://tipok.org.ua/ru/node/17
に、libaacplusのソースが置かれているので、適当にダウンロードして/opt/local以下にインストールし、configureのオプションに--enable-libaacplusつければ入ります。

ただ、優先順位としては、高い順に
  1. libaacplus
  2. ffmpeg実験コード
  3. libaac
になっているので、libaacを使いたい方、libaacplus入れたけど普通のAACを作りたい方は、ffmpegのオプションでaudio codecの設定が必要になります。libaacなら、-c:a libaac、libaacplusを入れてしまって内蔵の実験コードを選択したい方は、-strict experimental -c:a aacと指定することになります。

ffmpegのビルドとインストールも簡単で、configureのshell scriptを実行したあと、
# make install distclean
これだけです。

さて、次はmplayerなんですが、mplayer単体で動画を見る人もいるかもしれませんが、それならffplay使う手もあるし、どちらかというと、mencoderを使うために入れるのが普通だと思います。で、MacPortsのmplayer-develは現在、mplayerのsvnリポジトリとffmpegのgitリポジトリから最新版をもってくるようになっています。なので、port selfupdateしたあとport list outdatedしてmplayer-develの最新版が表示されないとしても、使うたびに再インストールする価値はあります。というわけで、
# port -f uninstall mplayer-devel
# port -f install mplayer-devel
するだけで、いつでも最新版に置き換えることができるわけです。画質は明らかに向上しますし、多くの場合処理速度も単調増加するので、最新版を維持する価値はあります。

ffmpegにせよmencoderにせよ、地デジ程度の解像度、特にアニメなんかの場合は20fps超えることもざらにあります。瞬間最高速度では60fps程度になることもしばしばです。

動画や音声のトランスコードをする人にffmpegは必須だと思いますし、何らかの形で生TSファイルを扱う人で、画と音がずれない方法を探している人には、いったんmencoderでAVI(なかみはMPEG4 simple profile)に変換することをおすすめします。このあたりはまた後日、機会があったら書いてみたいと思います。