x264をWindows上でビルドしてみた

この前、ちょっと時間が空いていたので
x264 を Windows上でビルドしてみました。前々からやってみたかった
今回は、その備忘録。

公式のx264バイナリは、http://x264.nl/でダウンロード可能ですが
今回は、ソースコードからコンパイルしてみたいと思います。

MinGW / MSYS 環境構築

環境構築は、「MinGW猫科研究所パック」を使わせて頂きました。
便利なパックを配布している猫科研究所さんに感謝。

まず、以下から「MinGW猫科研究所パック」をダウンロード。
MinGW猫科研究所パック

自分は「msys_felidlabo_a005.7z 」を選択。
msys_felidlabo_a005.7z をCドライブ直下(C:\)に解凍(容量は、230MB程度)
展開後 msys\_felidlabo の中の 04_gccinstall.bat を実行。

1) gcc-4.4.1-tdm を選択し、GCCがインストールされるまで待つ。

続いて 05_plus-build.bat を実行
インストールに30分程度掛かるので暫し待つ

Gitをインストール

以下からmsysGit(PortableGit-1.7.11-preview20120710.7z) をダウンロードして解凍する
http://code.google.com/p/msysgit/downloads/list
解凍先は c:\msys\Git

MSYSのコマンドラインから使うには
C:\msys\etc\profile の「alias clear=clsb」直後に以下を追加
alias git='/Git/bin/git.exe'

GPACをインストール

以下から gpac-0.4.5.tar.gz をダウンロード。
ダウンロード先はMSYSのホームディレクトリ C:/msys/home/xxxxx/ にしておく
(xxxxxはユーザ名が入る)
http://sourceforge.jp/projects/sfnet_gpac/releases/

最初にパッチを作成しておく。上記内容を適当なパッチファイル名 (gpac-infopp.patch など)でホームディレクトリ(C:/msys/home/xxxxx/)に保存。

--- src/media_tools/img.c
+++ src/media_tools/img.c
@@ -551,7 +551,7 @@
	/* Allocate/initialize the image information data.  REQUIRED */
	info_ptr = png_create_info_struct(png_ptr);
	if (info_ptr == NULL) {
-		png_destroy_write_struct(&png_ptr,  png_infopp_NULL);
+		png_destroy_write_struct(&png_ptr,  NULL);
		return GF_IO_ERR;
	}

解凍したmsysフォルダ内にある msys.bat を実行し
黒いウィンドウのコマンドラインを表示させる。

ここからは、このコマンドラインを使って行う。
pwd と入力し Enter を押せば、現在いるディレクトリが表示される。

ファイルを解凍し、gpacディレクトリに移動
そして、さっき作成したパッチをあてる。(以下のコマンド)

$ tar zxvf gpac-0.4.5.tar.gz
$ cd gpac
$ patch -Np0 < ../gpac-infopp.patch

最初につまづいた部分がここ。
Hunk #n FAILED at nnn. n out of n hunks FAILED — saving rejects to file file.rej
などとエラーが表示されて、かなり悩んだ。

エラーをもとに src/media_tools/img.c の修正箇所を覗いてみると
修正されていない。どうやらパッチが適用されていない模様。
何で失敗するんだろう…と思い、困った時の Google 検索。
そしたら、この問題にどんぴしゃりな情報を発見。

diffを利用したpatch適用と「hunk FAILED」「malformed patch」等の解決方法
http://uguisu.skr.jp/Windows/diff_patch.html
なるほど、空白(white space)が入っててエラーになったのか。

そういう訳で、書いてある通り空白を無視するように –ignore-whitespace を付け足す
$ patch -Np0 --ignore-whitespace < ../gpac-infopp.patch

無事パッチ適用完了したら config.hのコピーし make して make install
$ cp config.h include/gpac/internal/
$ make lib install-lib

yasm

ここがつまづいた部分、その二。
この yasm をインストールせずに、x264 を ./configure しようとしたら
こんなメッセージが表示された。

Found yasm 0.8.0.2194.
Minimum version is yasm-1.0.0.
If you really want to compile without asm, configure with --disable-asm.

とりあえず、yasm-1.0.0以降のバージョンが必要になるっぽい。

とりあえず、x264の ./configure 時に –disable-asm を付ければ通るは通るみたいだが
後で調べたところ、このyasmは x264 の高速なバイナリを作る際に必要なものらしいので、入れておく。

yasm-1.2.0 (yasm-1.2.0.tar.gz)をここからダウンロード。
以下のように、make install してみる。
$ tar zxvf yasm-1.2.0.tar.gz
$ cd yasm-1.2.0
$ ./configure --prefix=/mingw
$ make
$ make install

おお、無事に通ったみたい。

x264

さて、いよいよ本題の x264
gitから最新のソースコードを拾ってきます。
リビジョンは rev.2216。

$ git clone git://git.videolan.org/x264.git
$ cd x264

※「–enable-win32thread」はマルチスレッドの有効化
要するに並列処理して、エンコードを早くする機能の事です。
コマンドから利用するには –threads “auto” 等と指定可能
というか一々指定しなくてもデフォルトで指定される。

$ ./configure --enable-win32thread
....
gpac: yes
gpl: yes
thread: win32
....

上記のようにgpacがyes、threadがwin32になっているか確認

make fprofiledする為にサンプル動画を用意する(素材は何でもよい)
make fprofiledをやるのとやらないのでは
エンコパフォーマンスがかなり異なって来るらしい。

y4mファイルの作成方法は、次の記事で書くので少々、お待ち下さい。
$ make fprofiled VIDS="sample.y4m"

さて、後は make するだけ。
$ make
make: Nothing to be done for `default'

バイナリが出力されているか確認
$ ls x264.exe

何か最後にエラーっぽいメッセージが出たけど x264.exe は
ちゃんと出力されてるので大丈夫っぽい?

あー、長かった…お疲れ様でしたー。
記事がかなり冗長になってしまった気がします。
分割したり、個別の固定ページとした方が良かったような…。

あと、一気に書いたので間違いがあるかもしれません。
その時は、後で手直しするかも。

あくまで、個人用の備忘録メモなので
正確な動作や安全性を保証するものではない事に留意。

ffmpegビルドもやってみたいですね。

参考サイト

Windows上でWin32ネイティブスレッドを使う x264 をビルドする方法 – ..たれろぐ..
http://d.hatena.ne.jp/naga_sawa/20110131/1296467729

x264 を Windows 上でビルドする – ..たれろぐ..
http://d.hatena.ne.jp/naga_sawa/20100422/1271910683

Compiling x264 on 32 & 64 Bit Windows – Guide
http://doom10.org/index.php?topic=26.0

Linux日記: MinGWでx264、ffmpegをビルド
http://members.jcom.home.ne.jp/jacobi/linux/diary2011.html


広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中