2007年12月11日

FFmpegのコンパイル (2007/12/11)

いよいよ、FFmpegのコンパイルです。

bash-2.0だと、configureの判定ルーチンで引っかかって、
Broken shell detected. Trying alternatives.
というメッセージが出ますので、MinGWのwebページから
bash-3.1-MSYS-1.0.11-1.tar.bz2
をダウンロードして、MSYSのsh.exeを更新しておくと良いです。

最近は、gcc4.2.2でしかコンパイルしていなかったので気がつかなかったのですが、gcc3.4.xだと、コンパイルできたように見えても、ffmpeg.exeを実行するとクラッシュするようです。
2008/01/13追記
と思って、久々にrev.11518をgcc3.4.2でコンパイルしてみたら、正常に動作しました。
いつの間にか修正されていたようです。

安定版の最新はgcc4.2.2ですが、MinGWのwebページにはgcc4.2.1までしかないので、とりあえずそれをインストールしておきましょう。
C:\MinGWに環境があれば、以下のファイルをダウンロードして、C:\MinGWの下に解凍すればOKです。
gcc-core-4.2.1-sjlj-2.tar.gz
gcc-g++-4.2.1-sjlj-2.tar.gz

自分でgccをビルドするのは面倒だけど、gcc4.2.2を使いたいという方は、以下の所からダウンロードできます。
TDM's Experimental GCC/MinGW32 Builds
http://www.tdragon.net/recentgcc/

以下のライブラリは、あらかじめインストールしておいてください。
この記事を書いた時点より、新しくなっているものもありますので、それぞれの記事で確認してください。
nasm-0.98.39
yasm-0.6.2
pthreads-w32-2-8-0-release
zlib-1.2.3
a52dec-0.7.4
amrnb-7.0.0.0 (3GPP 26104-700)
amrwb-7.0.0.2 (3GPP 26204-700)
faac-1.26
faad2-2.6
gsm-1.0.12
lame-3.97
libnut-512
libogg-1.1.3
libvorbis-1.2.0
libtheora-1.0beta2
x264 rev.702
xvidcore-1.1.3

FFmpegは、以下の場所にあります。
http://ffmpeg.mplayerhq.hu/

x264と同様、svnがインストールされていれば、以下のようにして、ソースファイルを拾ってこれます。
$ svn co svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg

svnがインストールされていない場合でも、とりあえず、snapshotのソースファイルを拾ってくればコンパイルできます。

Download and SVNから、
http://ffmpeg.mplayerhq.hu/download.html
full checkoutの、
ffmpeg-checkout-snapshot.tar.bz2を、適当なディレクトリに保存します。

MSYSで、ファイルを保存したディレクトリに移動し、
$ tar xjf ffmpeg-checkout-snapshot.tar.bz2
$ cd ffmpeg-checkout-2007-12-10

ソースファイルを展開して作成されるディレクトリは、snapshotの日付になっていますので、その時点のディレクトリ名に読み替えて下さい。

1571行目の後、以下のように、elif check_libから2行追加します。
if enabled pthreads; then
if check_func pthread_create; then
:
elif check_func pthread_create -pthread; then
add_cflags -pthread
add_ldflags -pthread
elif check_func pthread_create -pthreads; then
add_cflags -pthreads
add_ldflags -pthreads
elif check_lib pthread.h pthread_create -lpthread -lwsock32; then
add_cflags -DPTW32_STATIC_LIB
elif ! check_lib pthread.h pthread_create -lpthread; then
die "ERROR: can't find pthreads library"
fi
fi

1611行目に、-lpthread -lwsock32を追加。
修正前) enabled libx264 && require x264 x264.h x264_encoder_open -lx264
修正後) enabled libx264 && require x264 x264.h x264_encoder_open -lx264 -lpthread -lwsock32

次に、libavcodec/pthread.cを修正します。
パッチファイルffmpeg-PTW32_STATIC_LIB.diffをダウンロードして、以下のコマンドを実行。
$ patch -p0 < ffmpeg-PTW32_STATIC_LIB.diff

rev.11142以降、携帯動画変換君で、以下のようなエラーが出る場合があります。
A>ConvertMovieToFile:NewMovieFromFile Error
A>Dialog : 処理実行中にエラーが発生しました [Error:-8971]
その場合は、こちらの修正も試してみてください。

修正が終わったら、configureを実行します。
--enable-libogg は、configureから削除されています。
$ ./configure --enable-memalign-hack --enable-pp --enable-swscaler --enable-gpl --enable-liba52 --enable-libamr-nb --enable-libamr-wb --enable-libfaac --enable-libfaad --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libvorbis --enable-libtheora --enable-libx264 --enable-libxvid --disable-ffserver --disable-ffplay --enable-avisynth --enable-small --enable-pthreads --extra-ldflags=-static --extra-cflags="-fno-strict-aliasing"

問題なければ、以下のようなメッセージが出ます。
install prefix /usr/local
source path /c/TEMP/ffmpeg-checkout-2007-12-10
C compiler gcc
make make
.align is power-of-two no
ARCH x86_32 (generic)
big-endian no
MMX enabled yes
CMOV enabled no
CMOV is fast no
EBX available yes
EBP available yes
gprof enabled no
debug symbols yes
strip symbols yes
optimizations small
static yes
shared no
postprocessing support yes
software scaler enabled yes
video hooking no
network support yes
IPv6 support no
threading support pthreads
SDL support no
Sun medialib support no
AVISynth enabled yes
liba52 support yes
liba52 dlopened no
libamr-nb support yes
libamr-wb support yes
libdc1394 support no
libfaac enabled yes
libfaad enabled yes
libfaad dlopened no
libgsm enabled yes
libmp3lame enabled yes
libnut enabled yes
libtheora enabled yes
libvorbis enabled yes
x264 enabled yes
XviD enabled yes
zlib enabled yes
License: GPL
(長いので、全部見たい方はこちらをどうぞ。)
Creating config.mak and config.h...

その後、
$ make

ffmpeg.exeが出来ていれば完了です。
posted by あべちん at 00:58 | Comment(14) | TrackBack(0) | FFmpegビルド
この記事へのコメント
こんばんわ
結局自分でのGCC4.2.2のビルドはうまくいきませんでした(泣)
やっぱりlibstdc++-v3でエラーになります

TDM's Experimental のGCC使わせてもらって
GCC4.2.2環境の構築できました!!

これでクラッシュにおびえずにコンパイルができます

ありがとうございました

また何かありましたら
質問や書き込みをすると思いますが
そのときはよろしくお願いします

Posted by 蓄電 at 2007年12月12日 03:20
蓄電さん、こんにちは。管理人です。
ん…、ビルドできませんでしたか…。
configureの時にコケているかもしれないので、
\i686-pc-mingw32\libstdc++-v3\config.log
などを見たら、何かわかるかもしれません。
Posted by あべちん at 2007年12月15日 23:22
なるほど

TDM入れるときにMINGWを
いったんすべて消してしまったので

次に挑戦するときは調べてみます

ありがとうございました
Posted by 蓄電 at 2007年12月16日 03:58
こんばんは。
使っているだけではつまらないので
コンパイルにも挑戦しようかと思ったのですが、
configureを走らせるといつもこんなエラーが出ます。
ERROR: avisynth and vfwcap_demuxer require w32api version 3.13 or later.
どういうことなんでしょう?
Posted by Kazuki Ashiya at 2009年02月04日 20:55
こんばんは。
あまり詳しくないのですが、コメントしてみます。
メッセージだけ見ると、w32apiのバージョンが古いということみたいですね。
http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=11550&release_id=645278
↑からw32apiの新しいバージョンを導入するのが一つ。
もしw32apiのパッケージが新しいのに、エラーが出る場合、関連するライブラリが導入できていない可能性があるかも知れません。
たとえばlibnutで以下の修正をしていなくて、似たようなエラーがでた覚えがあります。

○ftelloをftellに修正する。
参考:
http://ffmpeg.arrozcru.org/wiki/index.php?title=Libnut
Posted by at 2009年02月06日 19:02
すいません、名前入力しそこねました^^;
見当違いのコメントでしたら、すいません。
Posted by ケリー at 2009年02月06日 19:14
おお…!

パッケージの問題でしたか。うまくconfigureできるようになりました。これで何とかなりそうです。

ありがとうございます。
Posted by Kazuki Ashiya at 2009年02月07日 14:53
もう一つ質問です。makeしていると、
どうもサブディレクトリのmakeはやってくれないようなので
手作業でやっていると、
make: *** No rule to make target `x86/dsputil_yasm.o', needed by `libavcodec.a'. Stop.
というわけで止まってしまいます。
どうもコンパイラがdsputil_yasm.cを要求しているようなのです。
どうすればいいんでしょうかね?
Posted by Kazuki Ashiya at 2009年02月08日 23:25
Ashiyaさん、こんにちは。管理人です。
そのようなエラーは出たことがないので分かりません。
サブディレクトリがmakeされないということは今までありませんでしたので、どこかでコンパイルに失敗しているのではないでしょうか。

アセンブラYasmはインストールしていますよね?
あと、コンパイル方法の記事を書き直したので、参考にしてみてください。
Posted by あべちん at 2009年02月12日 00:30
ケリーさん、こんにちは。管理人です。
フォローありがとうございました。
代わりにコメントしてくださる方、大歓迎です!

今後ともよろしくお願いします。
Posted by あべちん at 2009年02月12日 00:35
管理人さん、こんばんは。

亀レスで解決済みかもですが、サブディレクトリのmakeについてコメントします。
私も同じ状態に一時なってましたが、makeを最新のものにすることでサブディレクトリもmakeしてくれるようになりました。
makeのバージョンの問題のようです。

それに気づくまではmingw32-makeと組み合わせてコンパイルしておりました。

それとyasmの問題ですが、yasmのインストール先が問題になる場合があるようです。
うろ覚えですが、たとえば場所が/bin/yasmの場合、うまくいかなかったように思います。
回避策は、
1.bashのaliasを利用する
~/.profileなどに
alias yasm='/c/msys/1.0/bin/yasm'
を追記することでいけた気がします。

これが無理なら、yasmのインストール先を、/usr/local/bin/など別の場所にしてみてください。
Posted by ケリー at 2009年02月21日 05:16
訂正です。
再度確認したところ、/bin/yasmの場合、alias指定では解決しませんでした。
Posted by ケリー at 2009年02月21日 05:29
何度もコメントすいません。
少し補足すると、私はgccやbinutilsを複数のバージョンの組み合わせで使えるようにしているため、パスの設定などが特殊だからなのかも知れません。

こちらでは
/usr/local/bin/yasm.exe
で上手く動作しています。

あるいはyasmをffmpegのソースと同じ場所に置いてしまうのもありかも^^;
Posted by ケリー at 2009年02月21日 05:44
ケリーさん、コメントありがとうございます。管理人です。

そういえば、makeは3.81にしてありました。
デフォルトでmakeは3.79だったかも?

ちなみに、私の環境では、
/mingw/bin/yasm.exe
です。
Posted by あべちん at 2009年02月21日 14:17
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/7996502
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック