Hatena::ブログ(Diary)

..たれろぐ.. このページをアンテナに追加 RSSフィード

2017-09-10

x264 を Windows 上でビルドする 2017

以前の環境(1, 2, 3, 4)で x264コンパイルが出来なくなってしまったので、 2017/9/10 時点でのビルド環境を作り直しました。
だいたい 2017-05-21 d2b5f4873e x86: Change assembler from yasm to nasmコミットせい(AVX512対応のためアセンブラがyasm→nasmに変更された)。

これまでの猫化パック環境に最新の nasm 入れようとしたけど、コンパイラのバージョンが古かったりで簡単にはいかなさそうだったので、ベーシックな MSYS2 ベースでの作り直しとなりました。

ビルドするもの

mp4 で出力できる x264(32bit)
32bit なのは既存 Avisynth の環境の都合。 64bit バイナリの方が早いらしい+avs4x26x 使えばいけるらしいけど手元未検証なので。

64bit 版をビルドしたい場合は次トピを参照してください。

用意するもの

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 -j3j3CPU数コア数にあわせて適当に 
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 のビルド


GPAC をhttps://github.com/gpac/gpac/releases:title=公式]からダウンロードします。
0.7 系は API が変わっているのか現 x264 (ba24899b) ではサポートされていないようなので、その前の
バージョンの 0.6.1tar.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


参考:

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証