FFmpegをWindows上でビルドする
【使用ツール】
- MinGW-w64 Toolchain
- MinGW Builds external-binary-packages (MSYS+git+...etc.)
- cmake
- FFmpeg
- nasm
- yasm
- lame
- fdk-aac
- openssl
- RTMPDump
- x264
- x265
【動機】
MP4動画をFFmpegで作成する際、aac変換を音質が良いとされているfdk-aacに任せたいがために、オレ流FFMpegビルドツールを使わせていただいてビルドを行っていたが、以下の点から自力でビルドすることにする。
- 当方のPC環境(WindowsVista 32bit)では、x265のビルド時のcmakeのオプションに「-DWINXP_SUPPORT="ON"」が指定されていないので、出来上がったffmpeg.exeが起動できない。
- オレ流FFMpegビルドツールで使用されているPolarSSLが古く、また、PolarSSLの後続であるmbed TLSでは、APIが大きく変更されRTMPDumpに適用できなくなっているようである。*1
- また、PolarSSLに上手くパッチが当たっていないせいか、FFmpeg上でhttps通信ができない。
- http通信でそのまま落としてきたシェルスクリプトを実行するというシステムがなんか怖い。
【概要】
いね氏が公開されているオレ流FFMpegビルドツールで使用されているシェルスクリプト、また、あべちん氏が公開されているお気に入りの動画を携帯で見ようの各記事を参考に以下のオレ流FFMpegビルドツールから以下の変更を加えてビルドする。
- ビルドしたFFmpegを配布することはないので、使用するライブラリをPolarSSLからOpenSSLに変更する。
- x265のビルド時のcmakeのオプションに「-DWINXP_SUPPORT="ON"」を指定してビルドする。
- ついでなので、コンパイラをgcc4.9.2(sjlj)からgcc5.2.0(dwarf)に変更する。
【ビルド手順】
-
MinGW-w64 ToolchainからMinGW環境をダウンロードする。
上記ダウンロードページにアクセスすると、バージョン別に分類されているが、これはgccのバージョンで分けられている。ここでは最新版の「5.2.0」にしておく。
続いて、「threads-win32」と「threads-posix」の二つがあるが、「threads-posix」を選択する。*2
次に、「sjlj」と「dwarf」の二つがあるが、これは例外処理の違いだそうで、*3
「sjlj→旧来の方式で古いプログラムに対しても安定して動作するが、パフォーマンスが悪い」
「dwarf→比較的新しい方式でパフォーマンスが良いが、古いプログラムではクラッシュする可能性がある」
といった違いがあるらしい。
今回は特に問題が無かったので「dwarf」を選択する。(64bitの方は「seh」を選択すればいいんじゃないだろうか。)
以上の選択をしていくと、「i686-5.2.0-release-posix-dwarf-rt_v4-rev0.7z」をダウンロードすることになる。 - MinGW環境を展開する
どこに展開しても構わないが、以下では「C:\build_ffmpeg\mingw32」に展開したものとする。 - MinGW BuildsからMSYS環境をダウンロードする
ここでは、Gitなどのツールが導入済みのMSYS環境をダウンロードする。最新のものを選べばよいので「msys+7za+wget+svn+git+mercurial+cvs-rev13.7z」をダウンロードする。 -
MSYS環境を展開する
MinGW環境のルート「C:\build_ffmpeg\mingw32」直下に「msys」を展開する。
続いて、「C:\build_ffmpeg\mingw32\msys\etc\fstab」を編集し、「C:/build_ffmpeg/mingw32 /mingw」と記述し、MSYS起動時にMinGW環境がマウントされるようにする。
次に、「C:\build_ffmpeg\mingw32\msys\msys.bat」を実行し、MSYSを起動する。 - cmakeをダウンロード・展開する。
「Latest Release」→「Windows ZIP」からcmakeのバイナリをダウンロードし、「C:\build_ffmpeg\mingw32\msys\local\cmake」に展開しておく。 -
各種ライブラリ・プログラムソースをダウンロードする
ダウンロードしたソースは「C:\build_ffmpeg\mingw32\msys\home\(ユーザ名)」に保存しておく。
以下のサイトから最新ソースをダウンロードする。
次に、MSYS上で、
git clone git://git.ffmpeg.org/rtmpdump rtmpdump
を実行し、RTMPDumpとx264のソースを取得する。
git clone git://git.videolan.org/x264.git - x264ビルド用のサンプルビデオソースをダウンロードする。
x264にはビデオサンプルを用いてプログラムの最適化を行うことができるので、せっかくならば用意しておいた方が良い。
Xiph.org :: Derf's Test Media Collectionのakiyoがよく用いられているようなので、これをダウンロードし、「C:\build_ffmpeg\mingw32\msys\home\(ユーザ名)」に保存しておく。 - 各種ライブラリ・プログラムソースをビルドする
以下のコマンドでそれぞれビルドしていく。詳細は割愛する。
PATH=$PATH:/usr/local/cmake/bin
export PATH
tar zxf nasm-2.11.08.tar.gz
cd nasm-2.11.08
./configure --prefix=/mingw
make
make install
cd ../
tar zxf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure --prefix=/mingw
make
make install
cd ../
tar zxf lame-3.99.5.tar.gz
cd lame-3.99.5
CFLAGS="-pipe -O3 -march=native" CC="i686-w64-mingw32-gcc" ./configure --prefix="/mingw/i686-w64-mingw32" --build="i686-w64-mingw32" --enable-nasm
make
make install
cd ../
tar zxf fdk-aac-0.1.4.tar.gz
cd fdk-aac-0.1.4
autoreconf -i
CFLAGS="-O3 -march=native -pipe" CC="i686-w64-mingw32-gcc" ./configure --prefix="/mingw/i686-w64-mingw32" --build="i686-w64-mingw32" --enable-fast-install
make
make install
cd ../
tar xzf openssl-1.0.2d.tar.gz
cd openssl-1.0.2d
./Configure mingw --prefix="/mingw/i686-w64-mingw32"
make
make install_sw
cd ../
cd rtmpdump
git pull
make SYS="mingw" CC="i686-w64-mingw32-gcc" SHARED="no" OPT="-O3 -pipe -march=native -fno-tree-vectorize" XLDFLAGS="-static"
cd librtmp
make install prefix="/mingw/i686-w64-mingw32" SYS="mingw" SHARED="no" PRIVATE_LIBS="-lws2_32 -lwinmm"
cd ../../
cd x264
git pull
PKG_CONFIG_PATH="/mingw/i686-w64-mingw32/lib/pkgconfig" ./configure --prefix="/mingw/i686-w64-mingw32" --enable-win32thread --enable-static --extra-cflags="-pipe -march=native"
make CC="i686-w64-mingw32-gcc" fprofiled VIDS="../akiyo_qcif.y4m"
make install
make install-lib-static
cd ../
tar xzf x265_1.8.tar.gz
cd x265_1.8
mkdir -p source/build
cd source/build
cmake -G "MSYS Makefiles" ../../source -DWINXP_SUPPORT="ON" -DCMAKE_INSTALL_PREFIX="/mingw/i686-w64-mingw32" -DENABLE_TESTS="ON" -DENABLE_SHARED="OFF" -DCMAKE_BUILD_TYPE="Release" -DCMAKE_CXX_FLAGS_RELEASE:STRING="-O3 -DNDEBUG -march=native -static-libgcc -static-libstdc++ -static" -DCMAKE_CXX_COMPILER="i686-w64-mingw32-g++"
make
make install
cd ../../../
tar xzf ffmpeg-2.8.1.tar.gz
cd ffmpeg-2.8.1
PKG_CONFIG_PATH="/mingw/i686-w64-mingw32/lib/pkgconfig" ./configure --prefix="/mingw/i686-w64-mingw32" --enable-version3 --enable-gpl --enable-nonfree --enable-avisynth --enable-openssl --enable-libfdk-aac --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-librtmp --enable-runtime-cpudetect --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --enable-cross-compile --target-os="mingw32" --arch="i686" --enable-w32threads --extra-cflags="-O3 -pipe -march=native" --pkg-config-flags="--static" --extra-ldflags="-static" --cc="i686-w64-mingw32-gcc"
make - 完成!
【追記(2016/05/18)】
FFmpegのコンパイル (2014/02/17) お気に入りの動画を携帯で見ようを参照するとextra-libsオプションはout-of-dateで、pkg-config-flagsオプションの方がベターなようなので修正。
[旧configureオプション]
PKG_CONFIG_PATH="/mingw/i686-w64-mingw32/lib/pkgconfig" ./configure --prefix="/mingw/i686-w64-mingw32" --enable-version3 --enable-gpl --enable-nonfree --enable-avisynth --enable-openssl --enable-libfdk-aac --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-librtmp --enable-runtime-cpudetect --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --enable-cross-compile --target-os="mingw32" --arch="i686" --enable-w32threads --extra-cflags="-O3 -pipe -march=native" --extra-libs="-lrtmp -lwinmm -lws2_32 -lgdi32 -lstdc++" --extra-ldflags="-static" --cc="i686-w64-mingw32-gcc"
*1:PolarSSLのコンパイル&インストール お気に入りの動画を携帯で見よう
*2:「threads-win32」と「threads-posix」の違いは、スレッド管理ライブラリの違いと思われる。理想としては、Windows標準の「threads-win32」の方なのだろうが、pthreadのみにしか対応していないプログラムもあるようなので、「threads-posix」を選択する。
参考:
Qt で MinGW-w64 を使用する際に必要になるスレッドモデルと例外機構の選択について | cutlassfish
猫科研究所 - MinGW+ffmpeg(A)pthreadは複雑
*3:Qt で MinGW-w64 を使用する際に必要になるスレッドモデルと例外機構の選択について | cutlassfish
Windows で Qt5 が遅いわけ | Qt のあれこれ (仮)