読者です 読者をやめる 読者になる 読者になる

k_piの雑記帳

個人的に困った点と、その解決法などをつらつら書き連ねた備忘録を兼ねたブログ

FFmpegをWindows上でビルドする

MinGW ffmpeg

【使用ツール】

【動機】

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)に変更する。

【ビルド手順】

  1. 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」をダウンロードすることになる。

  2. MinGW環境を展開する
    どこに展開しても構わないが、以下では「C:\build_ffmpeg\mingw32」に展開したものとする。
  3. MinGW BuildsからMSYS環境をダウンロードする
    ここでは、Gitなどのツールが導入済みのMSYS環境をダウンロードする。最新のものを選べばよいので「msys+7za+wget+svn+git+mercurial+cvs-rev13.7z」をダウンロードする。
  4. 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を起動する。

  5. cmakeをダウンロード・展開する。
    「Latest Release」→「Windows ZIP」からcmakeのバイナリをダウンロードし、「C:\build_ffmpeg\mingw32\msys\local\cmake」に展開しておく。
  6. 各種ライブラリ・プログラムソースをダウンロードする
    以下のサイトから最新ソースをダウンロードする。

    ダウンロードしたソースは「C:\build_ffmpeg\mingw32\msys\home\(ユーザ名)」に保存しておく。
    次に、MSYS上で、

    git clone git://git.ffmpeg.org/rtmpdump rtmpdump
    git clone git://git.videolan.org/x264.git

    を実行し、RTMPDumpとx264のソースを取得する。
  7. x264ビルド用のサンプルビデオソースをダウンロードする。
    x264にはビデオサンプルを用いてプログラムの最適化を行うことができるので、せっかくならば用意しておいた方が良い。
    Xiph.org :: Derf's Test Media Collectionakiyoがよく用いられているようなので、これをダウンロードし、「C:\build_ffmpeg\mingw32\msys\home\(ユーザ名)」に保存しておく。
  8. 各種ライブラリ・プログラムソースをビルドする
    以下のコマンドでそれぞれビルドしていく。詳細は割愛する。
    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
  9. 完成!

【追記(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"