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
    • 公式 からダウンロード
    • i686 でも x86_64 でもどちらでも

msys2 の準備

msys2を適当な場所にインストールする。 250MB ぐらい食うので余裕のある場所に。
展開した先の mingw32.exe を実行する。
シェルが開くので、ひとまずパッケージを更新する。

$ pacman -Syuu
パッケージデータベースの同期中...
mingw32 347.8 KiB 246K/s 00:01 [#####################] 100% (省略)
インストールを行いますか? [Y/n] Y
パッケージを取得します...
msys2-runtime-2.8.2... 2.3 MiB 304K/s 00:08 [#####################] 100% (省略) termionate MSYS2 without returning to shell and check for updates again for example close your terminal window instead of calling exit

で固まるので、ウィンドウを閉じる(閉じない場合は強制終了ダイアログにて強制終了)。

再度 mingw32.exe を起動して、パッケージ更新。

$ pacman -Syuu
パッケージデータベースの同期中...
mingw32 は最新です mingw64 は最新です msys は最新です (省略) 合計ダウンロード容量: 27.00 MiB 合計インストール容量: 126.71 MiB 最終的なアップグレード容量: 4.10 MiB
インストールを行いますか? [Y/n] Y
パッケージを取得します...
(省略) (52/52) 更新 wget [#####################] 100% $

ビルドに必要なパッケージのインストール。

$ 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
(省略) (70/70) インストール mingw-w64-i686-gcc [#####################] 100% $

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 -j3j3 は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

参考: