x264 を Windows 上でビルドする 2017
2021/02/11 追記
昨秋あたり移行、エンコード時にエラーを出すようになった!という場合は以下参照で。デフォルト文字コードが変更になってます。
x264 UTF-8になったとかそんなところのメモ - ..たれろぐ..
以下本文
以前の環境(1, 2, 3, 4)で x264 のコンパイルが出来なくなってしまったので、 2017/9/10 時点でのビルド環境を作り直しました。
だいたい 2017-05-21 d2b5f4873e x86: Change assembler from yasm to nasm のコミットせい(AVX512対応のためアセンブラがyasm→nasmに変更された)。
これまでの猫化パック環境に最新の nasm 入れようとしたけど、コンパイラのバージョンが古かったりで簡単にはいかなさそうだったので、ベーシックな MSYS2 ベースでの作り直しとなりました。
2020/06/20追記
ここでは MP4 muxer に GPAC を使っていますが、L-SMASH を使いたい場合は、「GPAC のビルド」の部分を こちら にある L-SMASH のビルドに差し替えてください。
ビルドするもの
mp4 で出力できる x264(32bit)
32bit なのは既存 Avisynth の環境の都合。 64bit バイナリの方が早いらしい+avs4x26x 使えばいけるらしいけど手元未検証なので。
64bit 版をビルドしたい場合は次トピを参照してください。
msys2 の準備
msys2を適当な場所にインストールする。 250MB ぐらい食うので余裕のある場所に。
展開した先の mingw32.exe を実行する。
シェルが開くので、ひとまずパッケージを更新する。
$ pacman -Syuu
- パッケージデータベースの同期中...
- インストールを行いますか? [Y/n] Y
- パッケージを取得します...
で固まるので、ウィンドウを閉じる(閉じない場合は強制終了ダイアログにて強制終了)。
再度 mingw32.exe を起動して、パッケージ更新。
$ pacman -Syuu
- パッケージデータベースの同期中...
- インストールを行いますか? [Y/n] Y
- パッケージを取得します...
ビルドに必要なパッケージのインストール。
$ pacman -S git make tar automake autoconf libtool pkg-config mingw-w64-i686-gcc 依存関係を解決しています... 衝突するパッケージがないか確認しています... パッケージ (70) automake1.10-1.10.3-3 automake1.11-1.11.6-3 (省略)
- インストールを行いますか? [Y/n] Y
nasm のビルド&インストール
まず nasm を公式からダウンロードします。
現時点で最新の http://www.nasm.us/pub/nasm/releasebuilds/2.13.01/ を使います。
$ wget http://www.nasm.us/pub/nasm/releasebuilds/2.13.01/nasm-2.13.01.tar.gz (省略) nasm-2.13.01.tar.gz 100%[===================>] 1.15M 126KB/s 時間 7.4s 2017-09-09 23:50:08 (161 KB/s) - `nasm-2.13.01.tar.gz' へ保存完了 [1210974/1210974] $
展開して configure
$ tar zxf nasm-2.13.01.tar.gz $ cd nasm-2.13.01 $ ./configure --prefix=/mingw32 configure: loading site script /mingw32/etc/config.site checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.exe (省略) config.status: creating doc/Makefile config.status: creating config/config.h config.status: executing default-1 commands $
そして make と make install
$ make -j3 ← j3 はCPU数コア数にあわせて適当に gcc -c -g -O3 -fwrapv -U__STRICT_ANSI__ -fno-common -Werror=attributes -W -Wall -pedantic -Wno-pedantic-ms-format -Wc90-c99-compat -Wno-long-long -Werror=implicit -Werror=missing-braces -Werror=return-type -Werror=trigraphs -Werror=pointer-arith -Werror=missing-prototypes -Werror=missing-declarations -Werror=comment -Werror=vla -DHAVE_CONFIG_H -I. -I. -I./include -I./include -I./x86 -I./x86 -I./asm -I./asm -I./disasm -I./disasm -I./output -I./output -o asm/nasm.o asm/nasm.c gcc -c -g -O3 -fwrapv -U__STRICT_ANSI__ -fno-common -W (省略) gcc -o rdoff/rdf2bin.exe rdoff/rdf2bin.o rdoff/librdoff.a libnasm.a rm -f rdoff/rdf2com.exe cd rdoff && cp -pR rdf2bin.exe rdf2com.exe rm -f rdoff/rdf2ith.exe cd rdoff && cp -pR rdf2bin.exe rdf2ith.exe rm -f rdoff/rdf2ihx.exe cd rdoff && cp -pR rdf2bin.exe rdf2ihx.exe rm -f rdoff/rdf2srec.exe cd rdoff && cp -pR rdf2bin.exe rdf2srec.exe $ make strip strip --strip-unneeded nasm.exe ndisasm.exe $ make install mkdir -p /mingw32/bin /usr/bin/install -c nasm.exe /mingw32/bin/nasm.exe /usr/bin/install -c ndisasm.exe /mingw32/bin/ndisasm.exe mkdir -p /mingw32/share/man/man1 /usr/bin/install -c -m 644 ./nasm.1 /mingw32/share/man/man1/nasm.1 /usr/bin/install -c -m 644 ./ndisasm.1 /mingw32/share/man/man1/ndisasm.1 $ nasm --version NASM version 2.13.01 compiled on Sep 10 2017 $ cd ~ $
GPAC のビルド
2020/06/20追記
MP4 muxer に L-SMASH を使いたい場合は、こちら の L-SMASH のビルドに差し替えてください。
GPAC を公式からダウンロードします。
0.7 系は API が変わっているのか現 x264 (ba24899b) ではサポートされていないようなので、その前の
バージョンの 0.6.1 のtar.gzを使います。
$ wget https://github.com/gpac/gpac/archive/v0.6.1.tar.gz (省略) v0.6.1.tar.gz [ <=> ] 8.69M 4.68MB/s 時間 1.9s 2017-09-10 09:09:00 (4.68 MB/s) - `v0.6.1.tar.gz' へ保存終了 [9113143] $
展開して configure
$ tar zxf v0.6.1.tar.gz $ cd gpac-0.6.1 $ ./configure --prefix=/mingw32
** System Configuration Install prefix: /mingw32 Source path: /home/foobar/gpac-0.6.1 C compiler: gcc C++ compiler: g++ make: make CPU: x86 Big Endian: no ** GPAC 0.6.1 rev Core Configuration ** debug version: no GProf enabled: no Static build enabled: no Memory tracking enabled: no Fixed-Point Version: no IPV6 Support: no Static Modules: no ** Detected libraries ** zlib: system SDL Support: no OpenGL support: yes TinyGL support: no OpenSSL support: no Mozilla XUL/GECKO support: no DirectX Support: yes XMLRPC Support: no wxWidgets support: no ** Extra Libraries used ** SpiderMonkey: no FreeType: no JPEG: no OpenJPEG: no PNG: no MAD: no FAAD: no XVID: no FFMPEG: no Xiph OGG: no Platinum UPnP: no AVCap: no A52 (AC3): no OpenSVCDecoder: no OpenHEVCDecoder: no Freenect: no Creating config.mak config.h is unchanged Check config.log for detection failures Done - type 'make help' for make info, 'make' to build $
ビルド。ライブラリだけでいいので、ターゲットは lib を指定します。
$ make lib -j3 例により j3 は環境に合わせて適当に fatal: Not a git repository: '/home/foobar/gpac-0.6.1/.git' No GIT Version found make -C src all (省略) mv ../bin/gcc/libgpac.dll ../bin/gcc/libgpac.dll.6.0.0 ln -sf libgpac.dll.6.0.0 ../bin/gcc/libgpac.dll.6 ln -sf libgpac.dll.6.0.0 ../bin/gcc/libgpac.dll make[1]: ディレクトリ '/home/foobar/gpac-0.6.1/src' から出ます $
ビルドされたライブラリのインストール。
$ make install-lib fatal: Not a git repository: '/home/foobar/gpac-0.6.1/.git' mkdir -p "/mingw32/include/gpac" install -m 644 /home/foobar/gpac-0.6.1/include/gpac/*.h "/mingw32/include/gpac" mkdir -p "/mingw32/include/gpac/internal" install -m 644 /home/foobar/gpac-0.6.1/include/gpac/internal/*.h "/mingw32/include/gpac/internal" mkdir -p "/mingw32/include/gpac/modules" install -m 644 /home/foobar/gpac-0.6.1/include/gpac/modules/*.h "/mingw32/include/gpac/modules" install -m 644 config.h "/mingw32/include/gpac/configuration.h" mkdir -p "/mingw32/lib" install -m 644 "./bin/gcc/libgpac_static.a" "/mingw32/lib" make installdylib make[1]: ディレクトリ '/home/foobar/gpac-0.6.1' に入ります fatal: Not a git repository: '/home/foobar/gpac-0.6.1/.git' install -m 755 bin/gcc/libgpac.dll.a /mingw32/lib install -m 755 bin/gcc/libgpac.dll /mingw32/bin make[1]: ディレクトリ '/home/foobar/gpac-0.6.1' から出ます $ cd ~ $
これで GPAC 入り x264 のビルド環境ができあがり。
x264 のビルド
あとは従来と同じく公式の git リポジトリから x264 のソースを clone してきてビルドするだけ。
公式 git リポジトリの公式からソースを clone する。
$ git clone http://git.videolan.org/git/x264.git
Cloning into 'x264'...
remote: Counting objects: 20569, done.
remote: Compressing objects: 100% (4266/4266), done.
remote: Total 20569 (delta 17004), reused 19713 (delta 16260)
Receiving objects: 100% (20569/20569), 4.83 MiB | 1.13 MiB/s, done.
Resolving deltas: 100% (17004/17004), done.
$
configure。 host オプション付けないと妙な exe ができるので注意。
ビット深度 10bit のバイナリを作る場合は --bit-depth=10 を追加する。
$ cd x264/ $ ./configure --extra-cflags="-pipe -march=native" --enable-strip --host=i686-w64-mingw32 platform: X86 byte order: little-endian system: WINDOWS cli: yes libx264: internal shared: no static: no asm: yes interlaced: yes avs: avisynth lavf: no ffms: no mp4: gpac gpl: yes thread: win32 opencl: yes filters: crop select_every lto: no debug: no gprof: no strip: yes PIC: no bit depth: 8 chroma format: all $
make する。何かしらの動画を使って最適化する場合は make fprofiled を使う。
ここでは、そこまでこだわってないので普通に make します。
$ make -j3 j3 オプションは環境に応じて(ry cat common/opencl/x264-cl.h common/opencl/bidir.cl common/opencl/downscale.cl common/opencl/weightp.cl common/opencl/intra.cl common/opencl/subpel.cl common/opencl/motionsearch.cl | ./tools/cltostr.sh common/oclobj.h dependency file generation... (省略) gcc-ranlib libx264.a gcc -o x264.exe x264res.o x264.o input/input.o input/timecode.o input/raw.o input/y4m.o output/raw.o output/matroska.o output/matroska_ebml.o output/flv.o output/flv_bytestream.o filters/filters.o filters/video/video.o filters/video/source.o filters/video/internal.o filters/video/resize.o filters/video/cache.o filters/video/fix_vfr_pts.o filters/video/select_every.o filters/video/crop.o filters/video/depth.o input/avs.o input/thread.o output/mp4.o libx264.a -lgpac_static -lz -lws2_32 -lwinmm -lshell32 -m32 -Wl,--large-address-aware -Wl,--dynamicbase,--nxcompat,--tsaware -s $
動作確認する。
$ ./x264 --version x264 0.152.2851 ba24899 built on Sep 10 2017, gcc: 7.2.0 x264 configuration: --bit-depth=8 --chroma-format=all libx264 configuration: --bit-depth=8 --chroma-format=all x264 license: GPL version 2 or later $
exit して msys をインストールしたフォルダの home\(ユーザ名)\x264\x264.exe を適当な場所に移動なりコピーするなりすればできあがり。
一応動くか確認。動くはず。
C:\msys32\home\foobar\x264>x264 --version x264 0.152.2851 ba24899 built on Sep 10 2017, gcc: 7.2.0 x264 configuration: --bit-depth=8 --chroma-format=all libx264 configuration: --bit-depth=8 --chroma-format=all x264 license: GPL version 2 or later
参考:
- MSYS2を利用したffmpegのビルド方法 - k_piの雑記帳 http://k-pi.hatenablog.com/entry/2017/04/09/221429
- MSYS2で快適なターミナル生活 - Qiita http://qiita.com/Ted-HM/items/4f2feb9fdacb6c72083c
- MSYS2 のインストール周りについて
- x264のビルド http://mylabo.webcrow.jp/x264.php
- x264 のコンパイルオプションの参考
- MSYS2を利用したffmpegのビルド方法 - k_piの雑記帳 http://k-pi.hatenablog.com/entry/2017/04/09/221429
- ビルド用のパッケージ類の参考