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

参考:

Git for Windows のエディタ (vim) でログが文字化けする問題

解決策

ユーザー・プロファイル・フォルダ %USERPROFILE% に .vimrc ファイルを作成し、以
下の 1 行を書いておく。

set encoding=utf-8

現象と経緯

コマンドラインから -m オプションでコミットメッセージを指定してコミットする。

>git commit -m "* 実験"


その後、 amend すると vim が起動して

>git commit --amend

こんな感じで文字化けしてしまい、何もできなくなってしまう。

vim文字コードを誤っているせいなので、環境変数 %USERPROFILE% にあるユーザー・プロファ
イル・フォルダ、一般には C:\Users\(ユーザ名) になっているので、そこに vim の設定ファイ
ル .vimrc を置き、文字コードを指定してやれば文字化けは回避できる様になる。

ユーザフォルダに .vimrc を作成し、以下の 1 行を書く。

set encoding=utf-8

これだけで、文字化けは解消できる。

>git commit --amend


Firefox 55 で使えなくなった The Addon Bar の代わり → Status-4-Evar

Firefox 55 で使えなくなった The Addon Bar (Restored) の代用アドオンとして Status-4-Evar を見つけた。
S4Eはこの 8/20 の更新で対応した模様。

自分の用途の範囲(アドオンアイコンをポチポチ置く)では The Addon Bar と同様に使えてる。

Firefox 55 で使えなくなって効いてるのが Make Link で、メニューが「エラー」となってて辛い。

あと、はてブ拡張がブクマ時のタグ一覧からのクリック→タグ挿入が効かなくなってて地味に辛い。

RTX5000 に ssh 接続できないバグ?

ファームウェア Rev.14.00.21 で遭遇。
Rev.14.00.22 に更新したら出なくなった。

ssh で接続して、ユーザ名とパスワードを入れるところまでは進むものの、
その後うんともすんとも言わなくなる。

login as: hogehoge(ッターン)
manager@192.168.1.1's password:(ッターン)

で、その後すぐに出るはずのログインメッセージが出てこずに固まる。

RTX5000 Rev.14.00.21 (Thu Jan 12 08:23:00 2017)
Copyright (c) 1994-2017 Yamaha Corporation. All Rights Reserved.
To display the software copyright statement, use 'show copyright' command.
00:a0:de:XX:XX:X0, 00:a0:de:XX:XX:X1, 00:a0:de:XX:XX:X2, 00:a0:de:XX:XX:X3
Memory 1024Mbytes, 4LAN
>

RTX5000のログには ssh 経由で接続成功してるらしきログが残っているもの
の、実際にはその先に進まず強制切断すると、ログには Logoff が残る。

Login succeeded for SSH: 192.168.1.200 hogehoge
Logout from SSH: 192.168.1.200 hogehoge

しばらく頭を抱えてから、ファームの更新具合を確認したら Rev.14.00.22 が出ていた
ので特に考えもなくなんとなくで更新。
そうするとこの症状はでなくなった。
リリースノート には書かれていないし、もしかしてレアなバグ踏んでた?

ITPRPTECH Media Wave HD Pro RED のレビュー

修正

以下本文

『メディアプレイヤー、NAS、外付ストレージの最強3in1』を謳う Media Wave HD Pro RED を手
に入れたのでレビュー。
残念ながら狙っていた用途と製品が合致していなかったのか、ぐぬぬなレビューとなってます。

Media Wave HD Pro RED は JUST SYSTEMS 直営の Just MyShop モデルとして ITPROTECH 社が 提供
しているメディアプレイヤーでこちらから購入可能です。 お値段は 8,000円前後。

ITPROTECH 社での公式ページはこちらで、公式ページにある通り、以下の特徴を謳ってます。

  • 2.5 インチ HDD or SSD × 1 を内蔵可
    • USB 3.1 で PC に接続することで USB 外付けドライブとして利用可
    • もちろんディスク内のメディアファイルは再生可能
  • 外部ストレージ対応
    • USB ストレージと microSD 上のメディアファイルを再生可
  • ネットワーク対応
    • NAS 上のメディアファイルの再生可
    • 自身のストレージを NAS として LAN 内に公開可

電源は AC アダプタ、 USB Type-A、車のシガーライターソケットの3種に対応する電源コードが付属
しています。USB 3.1 、HDMI、 LAN ケーブルも付属しており、各方面への接続に必要そうなケーブル
類は(長さを気にしなければ)一通りそろっています。

操作は一般的なストレージ内蔵型メディアプレイヤーと同じく、付属リモコンを介して全操作をする
形になっています。


さて、自分がこれに手を出した理由(期待)ですが、ネットワーク対応と言うことで自宅 QNAP の共
有フォルダに保存してある写真・映像データを PC レスで再生できる手頃なネットワークメディアプ
レイヤーとしてよさげかな、と触手が蠢いた次第です。
テック社の HD600A やバッファローの LT-V200 のような端末を期待してたわけです。

開封して動作確認てがら「何ができるのか」ということを探ったところ、

  • ストレージレス起動(内蔵ドライブ無し、USB外部ストレージ無し)
    • OK
    • 電源コードを繋いでから 1-2 分でメニューがでます
  • USB外部ストレージ内の映像データの再生 (1080/24P MKV H264L4.1+AAC)
    • OK
  • USB外部ストレージ内の音楽データの再生 (MKA FLAC)
    • NG
      • 一覧に表示されないため、 MKA 形式(拡張子)自体未対応っぽい
      • まぁマイナーだしねorz
  • DLNA 経由で QNAP 内の写真データの再生 (JPEG)
    • OK
    • 自動でスライドショーに
  • DLNA 経由で QNAP 内の映像データの再生 (720/30P MP4 H264L3.1+AAC)
    • OK
  • CIFS (Samba) 経由でQNAP 内の動画データの再生
    • NG : フォルダを開こうとすると待機中のまま固まる
      • 完全にフリーズするのではなく、待機アニメーションは動いているので何かしらのタイムアウト待ち?
      • 電源コード抜き差しで再起動しないと復帰せず
    • OK (1080/24P MKV H264L4.1+AAC)

こんな感じでポータブルメディアプレーヤーとしてはいいものの、メインの NAS と絡めたネットワークメディ
アプレーヤーとしては難あり、という感じにorz


CIFS のサポートは弱いようで、固まる以外にも

  • 不可視フォルダにアクセスできない
    • GUI 上からはフォルダを選択するしかない=直接フォルダ名を入力する方法が見あたらないため
  • 認証が必要なフォルダにアクセスできない?
    • 開こうとすると固まるため確証はないですが、たぶんユーザ名やパスワードを入力できない

という弱点がありました。ぐぬぬ
見たいファイルは不可視&要認証なフォルダに置いてるのよねorz

2017/9/2 公開のアップデートファームで改善されてました。

  • ユーザ名・パスワードが必要なフォルダはダイアログが出ます
  • 不可視設定しているフォルダは見えません
    • 直接指定する方法があるのかもしれませんが、触った分にはわかりませんでした。

他に気付いた弱点は以下の通り。

  • 外部メディア(USBストレージや microSD)の脱着は電源断状態でなければダメ
    • 電源コードを抜き差ししないといけない
    • 「これ(USBメモリ)の写真だしてー」みたいな要求に即応できない
      • ReadOnly で automount して〜みたいにできんだろうか
  • リモコンボタンの反応が一息遅い
    • 100ms 未満なんだろうけどディレイが入るのでもっさり感ある
    • SoC の RTD1185 が 500MHz らしいので仕方ないかなぁとも思う
  • NAS を相手にする場合、階層を潜るたびにネトワーク上でNASを探索してるようで、ボタン操作→画面反映までが待たされる。
    • 頻繁に出入りする機器でも無いのでキャッシュしといて欲しいなぁ
    • 2017/9/2 公開のアップデートファームで改善されてました。

Samba 経由で〜となると Raspberry Pi + Kodi とかのほうがいいのかなぁ…
「いかしたネットワークメディアプレイヤーがあるぜ!」ってのがあればコメントなりでお知らせいただければ。

nu board JABARAN を手に入れた。

設計やら何やらするときや打ち合わせやらでのアイデア練りまとめ用にnu boardJABARANを買った。
練り練り中はうだうだ考えながら書いて、書いては考え整理して修正して〜の繰り返しだから、やっぱり
ホワイトボード的なのがいいよねと。

現行モデルはそのまま持ち歩く想定で表紙が付いてるけれど、買ったのは旧モデルなのでケース+
ボード+マーカーの3点セット。

現行モデルのWTと同じく4面構成の片面方眼、裏側真っ白。

畳んでケースに入れるとだいたい A4 のクリップボードサイズなので、バッグに入れといて
ホワイトボードがない場所で打ち合わせしたりするときに、すっと取り出して見せるとスマー
トに見える(と期待)。
ケースあるからノートPCとかとバッグにつっこんどいでも痛みにくそうなのが旧モデルのメリット。

全部広げると A4×4 になるので、ミーティングテーブルに広げてあっちとこっちからうだうだ
やるにもよさげな感。

同じ方向性の製品に、バタフライボードもあるけれど、こちらは 1万円からとお高いのが
難点(切り離せたりで面白そうだけれども)。

JABARAN の方は、 2000円ちょいなので手は出しやすい。
nu board JABARAN 現行モデル(方眼&白)

両面白白モデルがあってもいいよなーとも思ったり。現行モデルも角を留めるゴムバンドがあれ
ばまとまりよさそうよね。