2009年02月11日

libfaacのコンパイル&インストール

libfaacは、以下の場所にあります。
http://www.audiocoding.com/

右サイドバーののDownloadsから、
http://www.audiocoding.com/downloads.html

FAAC Sourceの圧縮形式が3種類ある中で、ファイルサイズが小さいTAR.BZ2 Packageをダウンロードします。
faac-1.28.tar.bz2を、適当なディレクトリに保存します。

MSYSで、ファイルを保存したディレクトリに移動し、
$ tar xjf faac-1.28.tar.bz2
$ cd faac-1.28

パッチファイルfaac-1.28.diffをダウンロードして、以下のコマンドを実行。

$ patch -p1 < faac-1.28.diff

これで、./configureで --without-mp4v2 を付けなくてもコンパイルできるようになります。

以上の修正が終わったら、
$ ./bootstrap
$ ./configure --prefix=/mingw

※上記パッチを適用しない場合は
$ ./configure --prefix=/mingw --without-mp4v2
としてください。

$ make
$ make install

以上で終了です。
posted by あべちん at 13:03 | Comment(20) | TrackBack(0) | FFmpeg追加ライブラリ
この記事へのコメント
faacをリコンパイルしようと思ったら、またコケました。
まず、パッチを当てたfrontend/Makefile.amが機能していないのか、-lws2_32が指定されません。
それから、TDMさんとこのGCC4.3.3を使っているのですが、やっぱりlibstdc++.aでコケます。
前にやった時にどうやって回避したのか忘れちゃいました。しかもあろうことかアンインストールしているんでffmpegのコンパイルができません。

どうしたらいいんでしょう…(>_<)
Posted by Kazuki Ashiya at 2009年03月04日 21:16
おはようございます。

./configureで--without-mp4v2をつければ、とりあえずffmpegのコンパイルに必要なライブラリはできるかとは思います。
mp4v2のライブラリはfrontend(faac.exe)で出力したい場合に必要だったと思ったのですが、違うのかな?

あとlibstdc++.aでこける件ですが、ひょっとしてMinGWを複数バージョン導入されていませんか?
もしそうなら、faac/libtoolが他バージョンのMinGWのlibstdc++.aを見つけてしまい、それでシンボルが解決されていませんでした。
こちらの環境ではlibtoolの
sys_lib_search_path_specのパスを変更することで回避できました。
具体的には/mingw/lib(GCC-3.4.5をインストールしてます)となっているところを、変更することで回避できました。
ご参考まで。
Posted by ケリー at 2009年03月05日 06:01
あと、
>-lws2_32が指定されません。

の件ですが、パッチをあててから、bootstrapの実行をしているでしょうか?

こちらでCVSのソースで確認してみましたが、問題ありませんでしたよ。
Posted by ケリー at 2009年03月05日 06:13
MinGWの再インストール・libstdc++.aを最新バージョンに置き換え、でコケなくなりました。
ただ、-lws2_32は、bootstrapをしても付かなかったので、手動でつけました。
そもそも、bootstrapでエラーっぽいのばっかりでるのがいけないのかもしれません。
0 [main] perl 12228 open_stackdumpfile: Dumping stack trace to perl.exe.stackdump
./bootstrap: line 3: 12228 Segmentation fault (core dumped) aclocal -I .
0 [main] perl 11804 open_stackdumpfile: Dumping stack trace to perl.exe.stackdump
./bootstrap: line 4: 11804 Segmentation fault (core dumped) autoheader
0 [main] perl 10076 open_stackdumpfile: Dumping stack trace to perl.exe.stackdump
./bootstrap: line 10: 10076 Segmentation fault (core dumped) automake --add-missing
0 [main] perl 12156 open_stackdumpfile: Dumping stack trace to perl.exe.stackdump
./bootstrap: line 11: 12156 Segmentation fault (core dumped) autoconf
こんなのばっかりです。automakeとautoconfはちゃんと入れてあるんですけどね…?
Posted by Kazuki Ashiya at 2009年03月05日 21:02
こんばんは。

stackdumpがでるのは、なんでしょうね。
こちらでも高負荷で不安定なときにでるときがあります。
nice ./bootstrap とかでプロセスの優先度を下げてみるとか、どうでしょう?

あとはMSYSのバージョンとperl,autoconf,automakeなどのファイルの整合性がとれてないからとかかなぁ?
MSYSのDLLのバージョンの問題とか、他の関連ファイルとの整合性とか、ややこしそうですね^^;
テクノロジープレビューの新しいバージョンに一部更新するにしても、整合性が心配ではあります。

automake,autoconf関連は、私もいろいろ試行錯誤した記憶が、、。複数バージョン、どうやって導入したっけなぁ。
結局/bin以下のもとのファイルをリネームして、バックアップしておいて、新しいのを/usr/local/binに導入したんだったかな、、。
ちょっと忘れてしまいました。

私の環境もあまり安定しているとはいえないもので^^;
先に書いたように高負荷時にstackdump起こりますから^^;
Posted by ケリー at 2009年03月05日 21:49
 何度もすみません。gccのバージョンを上げたところ、faacのmakeに失敗するようになりました。
 やったのはTDM's GCC/mingw32 Buildsから4.3.3-tdm-1のSJLJ Unwindingの各コンパイラをダウンロードして、c:\mingw以下に展開しました。gcc --versionで4.3.3になっているのも確認しましたが、faacのmakeが以下のように止まります。やめとけばよかった…。

/bin/sh ../libtool --mode=link gcc -O2 -Wall -o faac.exe main.o input.o ../libfaac/libfaac.la ../common/mp4v2/libmp4v2.a -lm -lstdc++ -lws2_32
gcc -O2 -Wall -o faac.exe main.o input.o ../libfaac/.libs/libfaac.a ../common/mp4v2/libmp4v2.a /mingw/lib/libstdc++.a -lws2_32
c:/mingw/lib/libstdc++.a(eh_throw.o):eh_throw.cc:(.text+0x7b): undefined reference to `__w32_sharedptr_unexpected'
c:/mingw/lib/libstdc++.a(eh_throw.o):eh_throw.cc:(.text+0x8c): undefined reference to `__w32_sharedptr_terminate'
c:/mingw/lib/libstdc++.a(eh_globals.o):eh_globals.cc:(.text+0x4e): undefined reference to `__w32_sharedptr'
c:/mingw/lib/libstdc++.a(eh_globals.o):eh_globals.cc:(.text+0xb9): undefined reference to `__w32_sharedptr'
c:/mingw/lib/libstdc++.a(eh_globals.o):eh_globals.cc:(.text+0x179): undefined reference to `__w32_sharedptr'
c:/mingw/lib/libstdc++.a(eh_globals.o):eh_globals.cc:(.text+0x186): undefined reference to `__w32_sharedptr'
c:/mingw/lib/libstdc++.a(eh_globals.o):eh_globals.cc:(.text+0x1e3): undefined reference to `__w32_sharedptr'
c:/mingw/lib/libstdc++.a(eh_globals.o):eh_globals.cc:(.text+0x1ef): more undefined references to `__w32_sharedptr' follow
c:/mingw/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x67): undefined reference to `__w32_sharedptr_terminate'
c:/mingw/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0x97): undefined reference to `__w32_sharedptr_unexpected'
c:/mingw/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0xb3): undefined reference to `__w32_sharedptr_terminate'
c:/mingw/lib/libstdc++.a(eh_terminate.o):eh_terminate.cc:(.text+0xd3): undefined reference to `__w32_sharedptr_unexpected'
collect2: ld returned 1 exit status
make: *** [faac.exe] Error 1
Posted by ken at 2009年03月19日 22:01
どうもはじめまして。自分もいつもこちらのサイトを参考にさせていただいています。

そのエラーは MinGW の gcc 3.4.5 がインストールされているところに gcc 4.3.3 を上書きした際に起こるエラーで、違うバージョンの libstdc++.a をリンクしようとしてしまっています。

本来は /mingw/lib/gcc/mingw32/4.3.3/libstdc++.a の方がリンクされるべきなのですが、MinGW の gcc 3.4.5は /mingw/lib/libstdc++.a に c++ のライブラリを置いているのでこちらが先に見つかってしまうためです。
/mingw/lib/libstdc++.aと/mingw/lib/libstdc++.laを削除してからもう一度makeしなおしてみてください。

ついでに、TDM氏のgcc4.3.3のライブラリは全部/mingw/lib/gcc/ming32/4.3.3/以下にあるので、

/mingw/lib/libsupc++.a
/mingw/lib/libsupc++.la
/mingw/lib/debug/libstdc++.a
/mingw/lib/debug/libstdc++.la

も gcc 4.3.3 を上書きしたのであれば不要です。これも間違ってリンクされるとトラブルの元なので一緒に削除してしまうと良いと思います。
Posted by golgol at 2009年03月19日 22:57
golgolさんどうもありがとうございました。ご指摘の通りで、通るようになりまし。ffmpegのmakeも通ったんですが、新たな問題が。
1)./configureで-mtuneの指定にamdfam10 or nativeとするとmakeに失敗する。他のCPU指定ではうまくいくので、これはまだいいとして
2)gigabeat用のwmvファイルをffmpegで作成しようとするとffmpegが落ちる。ここの管理人さんがコンパイルされたffmpegだと大丈夫なので、私の作成したのがおかしいんだと思います。但し私が作成したffmpegでもここの【動画】QVGA高画質15fpsステレオ FFmpeg最新版として載っているファイルなら作成できるので一部のライブラリがおかしいように思います。
ffmpeg -i hoge.mpg -vcodec wmv2 -b 700kb -re -s 320x240 -acodec wmav2 -ab 96kb -ac 2 -ar 44100 hoge.wmv
としています。これでffmpegを起動すると、一通りのメッセージが表示され、press [q] to stop encodingと表示され、エンコードが始まったとたんに落っこちます。
Posted by ken at 2009年03月20日 13:10
AMD使ったこと無いので 1) の方は良く分かりませんが、make がとまったときに何かエラーが出ていませんか?
make >make.log 2>&1 等でログを保存してテキストエディタでみてみるとどこで問題が起きているか分かる可能性があります。
まずはこの辺から確認してみてください。
(ログを保存するときは make -j2 のように並列で動かすとごちゃごちゃになるので -j オプションは指定しないでやってください。)

2) の方は、gcc 4.3.3 を使う場合 -fno-tree-ch と -fno-common をつけてコンパイルしないと不正終了する場合がありますので、まず --extra-cflags に上記の2つを加えているか確認してください。
それから、

・./configure --enable-memalign-hack --enable-postproc といった最小構成でコンパイルしてみる
・--disable-sse --disable-ssse3 で SSE 以降のアセンブリを無効にしてみる

とかをやってみてはどうでしょうか。
Posted by golgol at 2009年03月20日 15:03
横レス失礼します。
1)についてですが、
1.makeにCPU指定はできません。
2. http://www.fan.gr.jp/~ring/doc/gcc_i386_option.html
を見ると、amdfam10 or nativeというタイプ指定は存在しません。

このどちらかに当てはまるのではないかと思います。
Posted by Kazuki Ashiya at 2009年03月22日 19:43
>ケリー様
お騒がせしたautoconf関連のエラーについて、いろいろやるうちに直ってしまいました。
現在、autoconfは2.56、automakeは1.7.1で安定しています。あまり最新版を追いかけてはいけないようですね。
以上、ご報告まで。
Posted by Kazuki Ashiya at 2009年03月22日 19:52
こんばんは
>Kazuki Ashiyaさま
環境が安定したようでよかったですね。

>2. http://www.fan.gr.jp/~ring/doc/gcc_i386_option.html
を見ると、amdfam10 or nativeというタイプ指定は存在しません。

については、上記サイトの情報が少し古いためです。
gcc-4.3.0系ではnativeやamdfam10といった指定が可能です。
詳しくは↓をご確認ください。
http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options

エラーが起きる理由はちょっとわかりかねますが^^;
Posted by ケリー at 2009年03月29日 00:58
ケリーさん、Kazuki Ashiyaさん、golgolさん、kenさん、コメントありがとうございます。

みなさんが代わりに回答してくださって、とても助かります。

いつか掲示板を設置して、過去のコメントなども見られるようにしたいです。
Posted by あべちん at 2009年04月02日 08:07
はじめまして、こんばんは。

今日、faac-1.28をダウンロード、パッチを当ててコンパイルしてみたのですが、最後の方で
...libtool: line 487: CDPATH: command not found
libtool: Version mismatch error. This is libtool 2.4, but the definition of this LT_INIT comes .....
とエラーを吐いてコンパイルできません。
一通り調べてみたのですが、初心者なものでよくわかりませんでした。

どうすればコンパイルできるのでしょうか?
Posted by wakoudo at 2010年11月29日 21:09
wakoudoさん、こんにちは。管理人です。

bootstrapを実行していないとか、何か手順を飛ばしていませんか?

あと、エラーメッセージは、他にヒントになるようなものは出ていませんでしたか?

私の環境でもやり直してみたのですが、エラーが再現できず、分かりませんでした。

すでに解決済みでしたらすみません。
Posted by あべちん at 2010年12月06日 06:58
>wakoudoさん

bin/m4が古くてbootstrapが異常終了したまま構わず処理を続けるとそのエラーが再現しますね
アップデートしましょう
Posted by hau at 2011年01月03日 11:18
hauさん、こんにちは。管理人です。

どうしても分からなかったのですが、原因はm4だったんですね。

ちなみに、私の環境では
m4 (GNU M4) 1.4.13
です。

情報ありがとうございました。
Posted by あべちん at 2011年01月04日 17:05
はじめまして、こんばんは。

少し前にこのサイトを参考にさせていただいて、faac内蔵のffmpegをコンパイルしたのですが、x264を使うエンコード時に、オプションに -profile aac_low をつけると、
Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, ra
te, width or height
とエラーをはきます。

どうすればエンコードできるのでしょうか?
Posted by neko at 2012年02月28日 23:24
nekoさん、はじめまして。管理人です。

エラーになるのは、-profile aac_low を付けた時だけですか?
もしそうでしたら、audio profileという意味で、
-aprofile aac_low
としてみてください。

これでもダメでしたら、他のオプションに原因があると思います。
Posted by あべちん at 2012年02月29日 01:42
こんばんは。

-aprofile オプションを使って変換できました。
ありがとうございます。
Posted by neko at 2012年02月29日 22:22
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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