k_piの雑記帳

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

MSYS2を利用したffmpegのビルド方法

【動機】

前回、MSYS+MinGW-w64でffmpegをビルドしていたが、MSYSの後続プロジェクトのMSYS2なるものがあるらしく、
開発が継続中+パッケージ管理システムpacmanが利用できるという利点から、MSYS2を利用してffmpegをビルドしてみた。

(検索かけると、同じようなMSYS2を用いたffmpegのビルド方法があるので、何番煎じだよって感じだが、とりあえず、自分はこんな感じだったという感じのメモということで・・・)

 【使用ツール】

【概要】

MSYS2の利点は、旧MSYSで更新が止まっていたツール群が更新されているだけでなく、
Arch Linuxで採用されているパッケージ管理システムのpacmanが利用できるところにある。
これのおかげで、各種ツール・ライブラリの導入、及び、更新が楽にできる。

今回は、前回MSYS+MinGW-w64ではビルドしていたnasm・yasm・lamepacmanで導入し、
fdk-aac・rtmpdumpなどはビルドしたうえで、ffmpegをビルドする。

また、MSYS2の方がパッケージ数が少ない+パッケージの更新が遅め(特にgcc)なので、
今回は、mingw32ベースでビルドする。
(mingw32の方はgit版のパッケージも速く最新版を提供してくれる。)

今回はソースからビルドしたが、x264やx265などは自分でビルドする気が無ければ、
mingw-w64-i686-x264-git、mingw-w64-i686-x265でもよさげな気がする。(筆者は試してない。)
また、pacmanによるパッケージ更新が遅い or pacmanのパッケージが気に食わないと思うなら、
前記事を参考にソースからビルドしてもいいと思う。

【ビルド手順】

  1. MSYS2 SourceForge Project PageからMSYS2環境をダウンロードする。
    上記ダウンロードページにアクセスすると、「i686(32bit)」・「x86_64(64bit)」があるが、好きな方を選択する。(筆者はi686を選択した。)
    次に、各リリース日毎に「.exe」と「.tar.xz」のものがあるが、「.exe」はインストーラー付きのもので、「.tar.xz」はインストーラー無しのものである。
    今回は、「.tar.xz」を選択した。
  2. MSYS2環境を展開する。
    どこに展開しても構わないが、以下では「C:\build_ffmpeg\msys32」に展開したものとする。
  3. MSYS2のセットアップ
    「C:\build_ffmpeg\msys32\msys2_shell.cmd」を実行し、処理が終わった後「exit」コマンドで閉じる。
  4. cmakeをダウンロード・展開する。
    「Latest Release」→「Windows ZIP」からcmakeのバイナリをダウンロードし、「C:\build_ffmpeg\msys32\local\cmake」に展開しておく。
  5. 各種ライブラリ・プログラムソースをダウンロードする。
    FFmpegx265はそれぞれリリースされているソースコードをダウンロード。
    ダウンロードしたソースは「C:\build_ffmpeg\msys32\home\(ユーザ名)」に保存しておく。
    次に、mingw-w64-i686系のパッケージを使用するので、「C:\build_ffmpeg\msys32\mingw32.exe」を実行し、
    Mingw32 shellに入り、
    git clone https://github.com/mstorsjo/fdk-aac.git
    git clone git://git.ffmpeg.org/rtmpdump rtmpdump
    git clone git://git.videolan.org/x264.git
    を実行し、RTMPDumpとx264のソースを取得する。
    続いて、Mingw32 shell上で、
    pacman -Syuu
    pacman -S git make tar automake autoconf libtool pkg-config mingw-w64-i686-gcc nasm yasm mingw-w64-i686-lame mingw-w64-i686-openssl
    を実行し、各種ツール・ライブラリを取得する。
    pacman -Syuu」実行にコア部分をアップデートするとフリーズするが、
    ウインドウを閉じて、シェルを再起動後「pacman -Syuu」を再度実行すればOK
    (ウインドウを閉じる際、「実行しているプロセスがある」と警告されるが、構わず閉じる。)
  6. x264ビルド用のサンプルビデオソースをダウンロードする。
    x264にはビデオサンプルを用いてプログラムの最適化を行うことができるので、せっかくならば用意しておいた方が良い。
    Xiph.org :: Derf's Test Media Collectionのakiyoがよく用いられているようなので、これをダウンロードし、「C:\build_ffmpeg\mingw32\msys\home\(ユーザ名)」に保存しておく。
  7. 各種ライブラリ・プログラムソースをビルドする。
    Mingw32 shell上で以下のコマンドでそれぞれビルドしていく。詳細は割愛する。
    export PATH=/usr/local/cmake/bin:$PATH

    cd fdk-aac
    ./autogen.sh
    CFLAGS="-O3 -march=native -pipe" CC="i686-w64-mingw32-gcc" ./configure --prefix="/mingw32/i686-w64-mingw32" --build="i686-w64-mingw32" --enable-fast-install
    make
    make install
    cd ../

    cd rtmpdump
    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="/mingw32/i686-w64-mingw32" SYS="mingw" SHARED="no" PRIVATE_LIBS="-lws2_32 -lwinmm"
    cd ../../

    cd x264
    PKG_CONFIG_PATH="/mingw32/i686-w64-mingw32/lib/pkgconfig" ./configure --prefix="/mingw32/i686-w64-mingw32" --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_2.3.tar.gz
    cd x265_2.3
    mkdir -p source/build
    cd source/build
    cmake -G "MSYS Makefiles" ../../source -DWINXP_SUPPORT="ON" -DCMAKE_INSTALL_PREFIX="/mingw32/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 xjf ffmpeg-3.2.4.tar.bz2
    cd ffmpeg-3.2.4
    PKG_CONFIG_PATH="/mingw32/i686-w64-mingw32/lib/pkgconfig:/mingw32/lib/pkgconfig" ./configure --prefix="/mingw32/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
    (一部のライブラリの導入にpacmanのパッケージを使用したので、ffmpegのconfigure時にPKG_CONFIG_PATHに/mingw32/lib/pkgconfigを追加している。)
  8. 完成!

[今後アップデートするときは・・・]

ffmpeg・x265は各サイトからダウンロードし、
pacmanで導入したパッケージのアップデートは「pacman -Syuu」で、
gitのところは「git pull」で更新すればいい。

【注意点】

rtmpdumpはmingw32のパッケージを使いたかったがffmpegのインストール時に「libz.dll.a」などが「linker input file unused because linking not done」でハネられ、逆に面倒なのでソースからビルドした。

また、cmakeはMSYS2のパッケージだと「MSYS Makefiles」のターゲットが無いので、windows用のバイナリを使用した。
mingw-w64-i686-cmakeパッケージでもいいはずだが、なぜか依存関係でrtmpdumpが入ってきてffmpegのビルドの際に邪魔してくるので不採用とした。)