さまざまな動画や音声を変換できるフリーソフト「FFmpeg」ですが、PSP用に使っていたバージョンを新しくするため自分でビルドする方式に挑戦してみました。
注意:本作業によって作成されたffmpeg.exeはlibfaacが有効になっているため再配布禁止です。また、BonTsDemux付属のffmpeg.exeを置き換える事もできません(理由は後述)
はじめに
タイトルにも書いた通り、今回ビルドにあたっての「縛り」としてWindows版FFmpegのビルド環境「MSYS/MinGW」のインストーラを使わずにビルドする事にしました。インストーラを使った方が情報も多いし手っ取り早いのですが、”MinGW(インストーラ不使用)で Ruby 1.8.7 をビルドする”の記事を見かけたのと、ffmpeg.exe1つ作るのにレジストリ汚すのはちょっと…とという理由で試した次第です。
なお、今回の挑戦にあたっては「お気に入りの動画を携帯でみよう」に掲載されている記事や差分ファイルを利用して行いました。ありがとうございます。
基底フォルダ(ディレクトリ)の準備
まず最初に、MSYS/MinGWの動作環境となるフォルダを作成します。ビルド作業中は1GB程度のディスク容量を消費するため、空き容量に余裕のあるドライブに作成する事をおすすめします。また、以後の作業はコマンドプロンプトを使って作業する事が多くなるため、あまり深いフォルダ階層に作ると移動が大変になるかもしれません。
# コマンドプロンプトまたはエクスプローラでフォルダを作成
mkdir D:\tmp\root
MSYS/MinGW構成パッケージのダウンロード
今回インストーラを使わないため、MSYS/MinGWの公式サイトより構成パッケージを1つずつ基底フォルダにダウンロードする必要があります。
MSYS
# BaseSystem
msysCORE-1.0.15-1-msys-1.0.15-bin.tar.lzma
msysCORE-1.0.15-1-msys-1.0.15-ext.tar.lzma
bash-3.1.17-3-msys-1.0.13-bin.tar.lzma
coreutils-5.97-3-msys-1.0.13-bin.tar.lzma
coreutils-5.97-3-msys-1.0.13-ext.tar.lzma
diffutils-2.8.7.20071206cvs-3-msys-1.0.13-bin.tar.lzma
gawk-3.1.7-2-msys-1.0.13-bin.tar.lzma
grep-2.5.4-2-msys-1.0.13-bin.tar.lzma
sed-4.2.1-2-msys-1.0.13-bin.tar.lzma
libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma
libintl-0.17-2-msys-dll-8.tar.lzma
libiconv-1.13.1-2-msys-1.0.13-dll-2.tar.lzma
libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma
# gmp
libgmp-5.0.1-1-msys-1.0.13-dll-10.tar.lzma
# make
make-3.81-3-msys-1.0.13-bin.tar.lzma
# findutils
findutils-4.4.2-2-msys-1.0.13-bin.tar.lzma
# patch
patch-2.6.1-1-msys-1.0.13-bin.tar.lzma
# mktemp
mktemp-1.6-2-msys-1.0.13-bin.tar.lzma
# m4
m4-1.4.14-1-msys-1.0.13-bin.tar.lzma
# perl
perl-5.6.1_2-2-msys-1.0.13-bin.tar.lzma
# crypt
libcrypt-1.1_1-3-msys-1.0.13-dll-0.tar.lzma
# zlib
zlib-1.2.3-2-msys-1.0.13-dll.tar.lzma ※不要かも
zlib-1.2.3-2-msys-1.0.13-dev.tar.lzma
MinGW
# BaseSystem/GNU-Binutils
binutils-2.20.51-1-mingw32-bin.tar.lzma
# BaseSystem/GCC
gcc-core-4.5.0-1-mingw32-bin.tar.lzma
gcc-c++-4.5.0-1-mingw32-bin.tar.lzma
libgcc-4.5.0-1-mingw32-dll-1.tar.lzma
# BaseSystem/RuntimeLibrary
mingwrt-3.18-mingw32-dev.tar.gz
w32api-3.14-mingw32-dev.tar.gz
# gmp
libgmp-5.0.1-1-mingw32-dll-10.tar.lzma
# mpc
libmpc-0.8.1-1-mingw32-dll-2.tar.lzma
# mpfr
libmpfr-2.4.1-1-mingw32-dll-1.tar.lzma
# libtool
libtool-2.2.7a-1-mingw32-bin.tar.lzma
# automake
automake-4-1-mingw32-bin.tar.lzma
automake1.11-1.11-1-mingw32-bin.tar.lzma
automake1.10-1.10.2-1-mingw32-bin.tar.lzma ※不要かも
automake1.9-1.9.6-3-mingw32-bin.tar.lzma
# autoconf
autoconf-7-1-mingw32-bin.tar.lzma
autoconf2.5-2.64-1-mingw32-bin.tar.lzma
automakeなど一部のパッケージはMSYS/MinGW両方に存在しますが、バージョン番号が新しい方だったり以後の作業で失敗した場合は差し替えたりして試行錯誤しました。今後各パッケージのバージョンアップが進めばこの通りにならない可能性もあります。
ダウンロードはこちらから。
コマンドライン版7-Zipのダウンロード
ダウンロードしたパッケージをウィンドウで1つずつ展開するのは手間がかかるため、コマンドライン版7-Zipを利用します。パッケージをダウンロードしたらZipファイル中より7za.exeのみを取り出し、前述の基底フォルダ上にコピーして下さい。
ダウンロードはこちらから。
パッケージの展開
コマンドプロンプトから7za.exeを使ってパッケージを一括展開します。展開済みパッケージはバックアップとやり直し用のため別フォルダに移動します。
cd /d D:\tmp\root
mkdir pkg
for %f in (*.tar.lzma) do ((7za x %f -so | 7za x -si -ttar) & move /y %f pkg\%f)
for %f in (*.tar.gz) do ((7za x %f -so | 7za x -si -ttar) & move /y %f pkg\%f)
for %f in (*.tar.bz2) do ((7za x %f -so | 7za x -si -ttar) & move /y %f pkg\%f)
for %f in (*.tgz) do ((7za x %f -so | 7za x -si -ttar) & move /y %f pkg\%f)
msys.batの編集
この作業はお使いのPC環境によっては不要かもしれません。今回実行したPC環境にはCygwinが入っているため、そちらのコマンドが誤動作しないようにパスをリセットするようにします。
# テキストエディタでmsys.batの数行目に以下を追加
set PATH=
/etc/fstabの編集
MSYS環境にマウントポイントを追加するため、D:\tmp\root\etcにファイル名"fstab"で空ファイルを作成し、以下の行を追加します。
# テキストエディタでfstabに以下を追加
D:/tmp/root /mingw
各種ライブラリのダウンロード&ビルド
ここからFFmpegビルドに必要な各種ライブラリのビルド作業に入ります。msys.batをダブルクリックしてMSYSプロンプトを開き、ビルド作業を実行します。途中含まれている7zaコマンドはそのライブラリのみビルドをやり直したい場合用で、前述までの作業を実施している場合は不要です。 (ていうかpkgフォルダに移動されているため実行できないはず)
一部ライブラリではパッチ適用作業が含まれていますが、そのファイルは「お気に入りの動画を携帯でみよう」さんのサイトから当該ライブラリのビルド手順ページに進み、事前にダウンロードしておきます。パッチファイルのダウンロード先は各ライブラリのフォルダ直下に置く前提で記述してあります。また、ビルド順は一部のライブラリのビルドで依存関係(libvorbisのビルドにはliboggが必要など)がある点に注意が必要です。
yasm
# 7za x yasm-1.1.0.tar.gz -so | 7za x -si -ttar
cd /yasm-1.1.0
./configure --prefix=/mingw
make
make install
nasm
# 7za x nasm-2.08.02.tar.bz2 -so | 7za x -si -ttar
cd /nasm-2.08.02
./configure --prefix=/mingw
make
make install
openssl
# 7za x openssl-1.0.0a.tar.gz -so | 7za x -si -ttar
cd /openssl-1.0.0a
patch -p1 < openssl-1.0.0-mingw.diff
cp test/dummytest.c test/jpaketest.c
cp test/dummytest.c test/md2test.c
cp test/dummytest.c test/rc5test.c
./Configure mingw --prefix=/mingw
make
make install_sw
※当初MinGWのパッケージでビルドしようとしていたのですが、FFmpegにlibrtmpをリンクする箇所が失敗するためソースビルドに切り替えています
opencore
# 7za x opencore-amr-0.1.2.tar.gz -so | 7za x -si -ttar
cd /opencore-amr-0.1.2
./configure --prefix=/mingw
make
make install
lame
# 7za x lame-3.98.4.tar.gz -so | 7za x -si -ttar
cd /lame-3.98.4
./configure --prefix=/mingw --enable-nasm
make
make install
libogg
# 7za x libogg-1.2.0.tar.gz -so | 7za x -si -ttar
cd /libogg-1.2.0
./configure --prefix=/mingw
make
make install
libvorbis
# 7za x libvorbis-1.3.1.tar.bz2 -so | 7za x -si -ttar
cd /libvorbis-1.3.1
./configure --prefix=/mingw
make
make install
libtheora
# 7za x libtheora-1.1.1.tar.bz2 -so | 7za x -si -ttar
cd /libtheora-1.1.1
./configure --prefix=/mingw
make
make install
librtmp
# 7za x rtmpdump-2.3.tgz -so | 7za x -si -ttar
cd /rtmpdump-2.3
make SYS=mingw CC=gcc AR=ar
cd librtmp
make install prefix=/mingw SHARED=no
gsm
# 7za x gsm-1.0.13.tar.gz -so | 7za x -si -ttar
cd /gsm-1.0-pl13/
# Makefileの編集
INSTALL_ROOT = /mingw
GSM_INSTALL_INC = $(GSM_INSTALL_ROOT)/include
make
make gsminstall
pthread
# 7za x pthreads-w32-2-9-0-release.tar.bz2 -so | 7za x -si -ttar
cd /pthreads
patch -p1 < pthreads-w64.diff
make clean GC-static
cp libpthreadGC2.a /mingw/lib/libpthread.a
cp pthread.h sched.h semaphore.h /mingw/include/.
x264
# 7za x x264-snapshot-20100812-2245.tar.bz2 -so | 7za x -si -ttar
cd /x264-snapshot-20100812-2245
patch -p1 < x264-pthreads-20100717.diff
./configure --prefix=/mingw
# http://media.xiph.org/video/derf/y4m/akiyo_cif.y4mをダウンロード
make fprofiled VIDS="akiyo_cif.y4m"
make install
libvpx
# 7za x libvpx-0.9.1-81.tar.bz2 -so | 7za x -si -ttar
cd /libvpx
patch -p1 < libvpx-0.9.0-20100528.diff
CFLAGS="-march=i686 -DPTW32_STATIC_LIB" ./configure --target=x86-win32-gcc --disable-examples
make
cp libvpx.a /lib/
mkdir -p /include/vpx
cp vpx/*.h /include/vpx/
xvid(本作業は不要)
# 7za x xvidcore-1.2.2.tar.gz -so | 7za x -si -ttar
cd /xvidcore
patch -p1 < xvidcore-1.2.2-pthreads-20100717.diff
patch -p1 < xvidcore-1.2.2-yasm.diff
patch -p1 < f1718874b.txt
cd build/generic/
./bootstrap.sh
./configure --prefix=/mingw
make
make install
※上記手順ではbootstrap.shによって作られたconfigureがpthreadテストで失敗するため、次のxvidのスナップショット版を利用して実施
xvid_latest
# 7za x xvid_latest.tar.gz -so | 7za x -si -ttar
cd xvid_20100814/xvidcore
cd build/generic/
./bootstrap.sh
./configure --prefix=/mingw
make
make install
※特にパッチを当てずに実行してしまったが、pthreadがスタティックリンクされていないかも…
libfaac
# 7za x faac-1.28.tar.bz2 -so | 7za x -si -ttar
cd /faac-1.28
patch -p1 < faac-1.28.diff
./bootstrap
./configure --prefix=/mingw
make
make install
FFmpegのダウンロード&ビルド
ここまで順調に進んだら、お目当てのFFmpeg本体のビルド作業に入ります。今回再配布をしない自分用のためFFmpegのconfigureオプションには"-vcodec libfaac"を有効にする設定を追加しました。なお、最適化オプションはCore2向けを使用しています。
# 7za x ffmpeg-checkout-snapshot.tar.bz2 -so | 7za x -si -ttar
cd /mingw/include
patch -p0 < strcasecmp.diff
patch -p0 < tempnam.diff
cd /ffmpeg-checkout-2010-08-14
patch -p1 < ffmpeg-20100727.diff
./configure \
--enable-memalign-hack --enable-gpl --enable-version3 \
--enable-postproc --enable-libopencore-amrnb \
--enable-libopencore-amrwb --enable-libgsm \
--enable-libmp3lame --enable-libvorbis --enable-libtheora \
--enable-libx264 --enable-librtmp --enable-libvpx \
--enable-libxvid --disable-ffserver --disable-ffplay \
--disable-ffprobe --enable-avisynth --enable-small \
--enable-pthreads --extra-ldflags=-static \
--extra-cflags="-mtune=core2 -mfpmath=sse -msse -fno-strict-aliasing" \
--enable-nonfree --enable-libfaac
make
※checkoutスナップショットを使っているのは単純にダウンロードファイルを間違えただけですorz ※そのせいかpthread関連のパッチがうまく当たらず、x264のconfigureで失敗する現象にハマりました。パッチ適用に失敗した箇所はdiffファイルと見比べて手動で適用しました
おわりに
以上の作業で最新のffmpeg.exeが作成されているはずです。実行してみて問題が無ければffmpeg.exeをコピーしてD:\tmp\root以下を全削除すればアンインストール完了です。
これでBonTsDemux付属のffmpeg.exeを最新版にできるぜ!と喜んでいたのですが、なぜかFFmpegコマンドが一瞬で終了してしまう現象が発生(これはBonTsDemuxからffmpeg.exeに"-f mpeg2video -i http://localhost:12345/video.m2v"のパラメータが渡されるのですが、ffmpeg.exeが"-f mpeg2video"をUnknown input format: ‘mpeg2video’エラーとしてしまうし、"-f mpegvideo"にしても処理が始まらない)して、結局徒労に終わってしまいました(涙)