2011年07月31日

FFmpegのコンパイル (2011/07/31) w32threads

それでは、FFmpeg(w32threads版)のコンパイルです。

MSYSとMinGWから準備する方は、1、2番の記事からお読みください。
MSYSとMinGWの準備ができている方は、3番の記事からお読みください。

1. MSYS環境のアップデート

2. MinGW環境のアップデート

2012/05/02 追記
FFmpegのDirectShow(dshow)を有効にするためには、MinGW-w64が必要です。
MinGWのmingwrtとw32apiの代わりに、MinGW-w64を使う方手順は、以下の記事を参照してください。
MinGW-w64 for win32 のインストール

3. 個別のライブラリについて
以下のライブラリは、あらかじめインストールしておいてください。
この記事を書いた時点より新しくなっているものもありますので、それぞれの記事で確認してください。
nasm-2.09.10
yasm-1.1.0
zlib-1.2.5
bzip2-1.0.6
libbluray-0.2.2
libcdio-0.83git
gsm-1.0.13
libmodplug-0.8.8.4
lame-3.98.4
opencore-amr-0.1.2
vo-aacenc-0.1.1
vo-amrwbenc-0.1.1
libogg-1.2.2
aoTuV Beta6.03 (libvorbis-1.3.2)
libtheora-1.1.1
speex-1.2rc1
libvpx-v1.0.0
x264 (make fprofiled)
xvidcore-1.3.2

OpenSSLを使用する場合は、以下の記事を参照してください。
openssl-1.0.0d
rtmpdump-2.4

PolarSSLを、OpenSSLの代わりに使用する場合は、以下の記事を参照してください。
当サイトでは、PolarSSLを使用しています。
polarssl-1.0.0
rtmpdump-2.4 PolarSSL版

2011/11/11 追記
GnuTLSを、OpenSSLの代わりに使用する場合は、以下の記事を参照してください。
OpenSSLはGPL非互換なので、GnuTLSかPolarSSLをおすすめします。
gnutls-3.0.12
rtmpdump-2.4 GnuTLS版

2011/12/07 追記
字幕ファイルを読み込むためのライブラリlibassを追加する場合、以下のライブラリが必要になります。
pkg-config_0.26-1_win32
libiconv-1.13.1
freetype-2.4.8
expat-2.0.1
fontconfig-2.8.0
fribidi-0.19.2
libass-0.10.0


4. FFmpegのコンパイル
FFmpegは、以下の場所にあります。
http://ffmpeg.org/

ソースコードはGitで管理されるようになり、SVNはrev.26402で更新が止まっています。
今後は、Gitをインストールして、以下のコマンドでソースコードを入手してください。
$ git clone git://git.videolan.org/ffmpeg.git

または、
Get FFmpeg
http://ffmpeg.org/download.html
ここの、一番上のSnapshotのリンクからソースコードをダウンロードできます。
ファイルは、ffmpeg-HEAD-(Gitハッシュ値).tar.gz という形式になっていますので、そのファイル名に読み替えてください。
$ tar xzf ffmpeg-HEAD-3b5ddf0.tar.gz
$ cd ffmpeg-HEAD-3b5ddf0

次に、configure、その他諸々の一括パッチを適用します。

2012/07/22 追記
パッチを更新しました。(rev.42739(9e1508f)〜)
ffmpeg-20120722.diff

2012/01/30 追記
FFmpeg rev.37209以降の更新で、「-flags2」で設定していたものが独立したオプションになり、特にx264関連の設定が大幅に変わりました。
以前の「-flags2」の設定も使用できるように、Revert用のパッチを作りましたので、必要であれば適用してください。

2012/06/16 追記
「-flags2」用のパッチを更新しました。(rev.41595(15f8941)〜)
ffmpeg-global_opts-20120615.diff

2012/04/17 追記
2012/04/13 以降、以下のようなエラーが出る場合があります。
library.mak:95: *** missing separator. Stop.

ファイルの最後に、改行コードが入っていないものがあるのが原因です。
その場合は、以下のパッチを適用してください。

2012/05/10 追記
改行コードが原因のエラーが出るMakefileが増えるたびに、パッチを適用するのも面倒です。
ダウンロード(git clone)済みのソースコードがある場合、一旦Makefileを全部削除して、改行コードをLFにして作成し直せば、エラーが出なくなります。

$ echo 'Makefile eol=lf' > .gitattributes
$ find ./ -name 'Makefile' -print | xargs rm
$ git stash

その後、以下のパッチを適用します。

$ patch -p1 < ffmpeg-20120722.diff
$ patch -p1 < ffmpeg-global_opts-20120615.diff

パッチを適用したら、configureを実行します。

FFmpeg SVN rev.23653から、libfaadが削除されました。
HE-AAC v2デコーダーが本体に実装されたので、libfaadは不要になったらしいです。
古い記事を参考にしている方で、
Unknown option "--enable-libfaad".
というメッセージが出る場合は、
--enable-libfaad --disable-decoder=aac
は削除してください。

2012/05/26 追記
テスト(make fate)を実行するためにffprobeが必要だったのですが、また必要なくなりました。
configureオプションに、--disable-ffprobe を追加しました。

$ ./configure --enable-gpl --enable-version3 --enable-avisynth --enable-fontconfig --enable-libass --enable-libbluray --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libcdio --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-librtmp --enable-libspeex --enable-libvorbis --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvpx --enable-libx264 --enable-libxvid --disable-ffplay --disable-ffprobe --disable-ffserver --enable-w32threads --extra-ldflags=-static --extra-cflags="-mtune=athlon64 -mfpmath=sse -msse" --cpu=i686 --optflags="-O2 -finline-functions"


最適化レベルは、以前は、
--enable-small 有りの場合 -Os
--enable-small 無しの場合 -O3
しか選択できませんでしたが、FFmpeg Git rev.30971(4b87a08)から、
--optflags
というオプションが追加され、最適化レベルを変えられるようになりました。

--enable-small 有りだと、バイナリのサイズは小さくなるが、エンコード速度が落ちる。
--enable-small 無しだと、エンコード速度は速いが、バイナリのサイズがでかくなる。
--enable-small 無しで、--optflags="-O2 -finline-functions" だと、バイナリサイズがあまり大きくならないわりに、--enable-small 無しの場合とエンコード速度が大して変わらない。

ということで、色々試した結果、以下のようにしました。
--enable-small 無し
--optflags="-O2 -finline-functions" 追加


最適化オプションは、PCの環境により以下のようにしています。
※あくまでも一例ですので、もっと凝ってみたい方は、gccのマニュアルなどを見て研究されると良いかもしれません。

最適化無し版
--extra-cflags="-march=i686 -mtune=generic"

Pentium4最適化版
--extra-cflags="-mtune=pentium4 -mfpmath=sse -msse" --cpu=pentium4

Core2最適化版
--extra-cflags="-mtune=core2 -mfpmath=sse -msse" --cpu=i686

Athlon64最適化版
--extra-cflags="-mtune=athlon64 -mfpmath=sse -msse" --cpu=i686

Phenom最適化版
--extra-cflags="-mtune=amdfam10 -mfpmath=sse -msse" --cpu=i686

FFmpegのconfigureオプションに、
--cpu=athlon64
などど追加すると、そのCPUに特化した最適化が実行されますので、ご自分の環境でしか使用しない場合は、試してみると良いかもしれません。

2012/01/07 追記
Core2最適化版、Athlon64最適化版、Phenom最適化版のconfigureオプションに、--cpu=i686 を追加しました。
Pentium4のconfigureオプションに、--cpu=pentium4 を追加しました。
configureの結果に以下のような違いがあります。

・「--cpu」オプション無し
CMOV enabled=no, CMOV is fast=no, EBX available=yes, EBP available=no
・「--cpu=i686」オプション追加
CMOV enabled=yes, CMOV is fast=yes, EBX available=yes, EBP available=yes
・「--cpu=pentium4」オプション追加
CMOV enabled=yes, CMOV is fast=no, EBX available=yes, EBP available=yes


問題なければ、以下のようなメッセージが出ます。
source pathはコンパイル環境により異なります。
思ったよりも時間がかかりますので、気長に待ちましょう。

configureのメッセージを見る

(長いので中略)
License: GPL version 3 or later
Creating config.mak and config.h...

その後、
$ make

ffmpeg.exe が出来ていれば完了です。


【補足】
自分用の場合は、再配布を考えなくても良いので、libfaac入りのFFmpegをビルドすることもできます。

追加で、libfaacをコンパイル&インストールします。
libfaac のコンパイル&インストール

configureオプションの適当な所に、
--enable-nonfree
--enable-libfaac
を追加します。

configureのメッセージに、
libfaac enabled yes
と表示されていれば、makeして完了です。

FFmpegのエンコードオプションで、
-acodec libfaac
が使えるようになります。

当サイトで配布しているFFmpegは配布用のため、libfaacは無効にしています。


【更新履歴】を見る
posted by あべちん at 05:15 | Comment(17) | TrackBack(0) | FFmpegビルド
この記事へのコメント
無事libfaac入りのバイナリを作成することができました。ありがとうございました。
丁寧に解説してあり、パッチも用意されていますので、記事のとおりに操作すれば完璧です。素晴らしい!
1点だけ、MSYSはMinGWのパッケージで入ってしまうので、インストール不要でした。
ttp://www.kkaneko.com/rinkou/cygwin/mingw.html
Posted by honya at 2011年11月06日 15:23
honyaさん、こんにちは。管理人です。
コメントありがとうございます。

お役に立てて良かったです。

> 1点だけ、MSYSはMinGWのパッケージで入ってしまうので、インストール不要でした。

確かに、いっぺんにインストール出来た方が楽ですね。


だいぶ前に試した時、MSYS関連のツールまでMinGWのディレクトリに入ってしまうのが嫌で、使うのをやめたような?

しばらく試してなかったので、時間のある時に試してみます。

ご指摘ありがとうございました。
Posted by あべちん at 2011年11月08日 02:01
あべちんさん、お久しぶりです。
Kazuki Ashiyaです。

すごく久々にビルドしようとしたら、以前は全く問題なかったところでエラーになって困っています。
libavformat/os_support.cのところです。
以前もこのブログで上がっていたようでbashを入れ直してみたのですが、全く直りません。

何が問題なのでしょう?
要はソケットのヘッダ周りですよね…
Posted by Kazuki Ashiya at 2011年11月22日 17:59
Kazuki Ashiyaさん、こんにちは。管理人です。
お久しぶりです。

ソケットのヘッダ周りなら、w32apiでしょうか。

ちなみに私の環境では、
w32api-3.17
mingwrt-3.20
binutils-2.21.53
となっています。

GCCは、4.5系でも4.6系でも大丈夫なはずです。

エラーメッセージを載せていただけると、解決のヒントになるかもしれません。
Posted by あべちん at 2011年11月22日 20:58
こんばんは。再びKazuki Ashiyaです。

エラーメッセージは大量すぎるので載せられません(汗
見たところではwinsock2.hとio.h、socket.h、in.h、inet.h、netdb.hの間で大量にconflictしているわけなんですよね。
今さっきMSYSもMinGWも全部新しくしなおしたので、w32apiとかも全部新しくなってるんですけど、それでもまだ出ますね。

なんなんだろう…。
Posted by Kazuki Ashiya at 2011年11月22日 23:30
> Kazuki Ashiyaさん

たとえば、
make 1>out.log 2>err.log
などと出力をログに保存して、err.logから該当する部分をpastebinで共有するというのはいかがでしょうか?

pastebinにテキストをペーストしてから、Submit Postして、出てきたURLを教えていただければ、だれでも見られるようになります。

pastebinは、
http://pastie.org/
http://paste2.org/
http://ja.pastebin.ca/
あたりが簡単そうです。

私がエラーメッセージを見ても解決できるかどうか分かりませんが、どなたか分かる方がいらっしゃるかもしれません。
Posted by あべちん at 2011年11月23日 16:28
こんにちは。Kazuki Ashiyaです。

pastebinにアップしてみました。
http://ja.pastebin.ca/2094629

ちなみに、w32apiをソースからビルドしてみたけど変わりませんでした。
Posted by Kazuki Ashiya at 2011年11月23日 18:24
> Kazuki Ashiyaさん

エラーのログ見てみました。

include/netdb.h
include/sys/socket.h
include/bits/socket.h
include/arpa/inet.h

など、私のMinGW環境には無いインクルードファイルでエラーになっています。

glibcとか、何か特殊なライブラリなどインストールしていませんか?
Posted by あべちん at 2011年11月23日 19:52
こんばんは。Kazuki Ashiyaです。

そうか、glibcが悪さしていたのか…
アンインストールしたらうまく行きました。ご迷惑をおかけしました。

GCCを自前でビルドするときにいるんだったかな…でインストールしたのをすっかり忘れていました。今度から別個に環境作ってやることにします。
Posted by Kazuki Ashiya at 2011年11月23日 22:10
Kazuki Ashiyaさん、こんにちは。管理人です。

確証は無かったのですが、glibcで当たってましたか。

私も以前、glibcをインストールしようとして、うまくいかなかったことがあったような?

とりあえず、解決してよかったです。
Posted by あべちん at 2011年11月25日 00:28
パッチを当てるとビルドできないです。

http://sourceforge.net/projects/mingw/files/MSYS/Base/msys-core/msys-1.0.11/
MSYS-1.0.11.exeをダウンロード
http://sourceforge.net/projects/mingw/files/MinGW/
mingw-get-inst-20111118.exeをダウンロード
C++ Compilerにチェックを入れる

MSYSとmingwをインストールする
パスを環境変数から;C:\MinGW\binを追加する

http://git.videolan.org/?p=ffmpeg.git;a=snapshot;h=HEAD;sf=tgz
からffmpeg-HEAD-58c2572.tar.gzをダウンロード
http://downloads.xiph.org/releases/speex/speex-1.2rc1.tar.gz
からspeex-1.2rc1.tar.gzをダウンロード

C:\msys\home\owner に

ffmpeg-HEAD-58c2572.tar.gz
speex-1.2rc1.tar.gz

を移動してwinrarで2つを解凍

C:\msys\msys.bat を起動して
cd speex-1.2rc1
./configure --prefix=/mingw --enable-sse
make
make install
cd
cd ffmpeg-HEAD-58c2572
./configure --enable-gpl --enable-version3 --enable-libspeex --disable-yasm

ここでエラーが出て止まってしまいます。

config.log の最後にこのように書いてあります。
C:/Users/owner/AppData/Local/Temp/ffconf..OWNER-PC.500.5860.c:1:25: fatal error: speex/speex.h: No such file or directory
compilation terminated.
ERROR: libspeex not found

PCのOSはWin7 64bitとVista 32bitでも試しました。

config.log の全部はこちらです。
http://privatepaste.com/160b1c230f

今回のSpeexに限った話ではないのですが、x264やlameでもNo such file or directoryと
同様のエラーが出てしまいます。どのようにすれば解決できるでしょうか。
Posted by ロベルト at 2012年04月08日 16:22
ロベルトさん、こんにちは。管理人です。

全部「No such file or directory」になってしまうということは、おそらく、MinGWのディレクトリ「C:\MinGW」が「/mingw」にマウントされていないのではないでしょうか。

C:\msys\1.0\etc\ の「fstab」というテキストファイルに、

c:/MinGW /mingw

という1行はありますか?

「fstab」がなければ、テキストファイルを新規作成して、上記の1行を追加してみてください。

「C:\MinGW」が「/mingw」にマウントできていれば、Windowsの環境変数は修正しなくても良いはずです。

MSYSをインストールする時に、MinGWのインストール先を訪ねられたと思いますが、そこで
c:/MinGW
と指定すれば、自動で「fstab」を書き換えてくれるようになっています。


mingw-get-inst-20111118.exeでMSYSも一緒にインストールすれば、「fstab」も勝手に設定してくれますので、いろいろ試して上手く行かなければ、最初からインストールし直してみると良いかもしれません。
Posted by あべちん at 2012年04月08日 18:38
お返事ありがとうございます。
まだ他にもエラーが出ているのでもう少し調べてみます。
Posted by ロベルト at 2012年04月08日 23:38
aacplusのパッチを当てるとffmpegビルド時にnot foundのエラーがでる

先日はありがとうございました。ロべルトです。無事にlameパッチを当てたffmpegはビルドできましたが、
今度はaacplusのパッチを当てたffmpegをビルドしようとするとエラーが出て先に進まなくなりました。

ビルドにはmingw-get-inst-20111118を使用して
"C:\MinGW\msys\1.0\msys.bat"を実行しています。

エラーは libaacplus >= 2.0.0 not found です。

libaacplus-2.0.2
ffmpeg-HEAD-58c2572
を使用して、libaacplusのパッチは当てていません。

libaacplusは
./autogen.sh --enable-shared --enable-static
make
make install
してlibaacplus-2.0.2\frontend\.libsにaacplusenc.exeが単体では起動できずに
libaacplus-2.dllが必要と言われて、これを同じ所に置くとaacplusencが使えました。

ffmpegは
# ./configure --enable-static --enable-shared --enable-gpl --enable-nonfree --enable-libaacplus
を実行してlibaacplus >= 2.0.0 not foundで止まります。

ログは以下のとおりです
libaacplus
http://privatepaste.com/fd88853a48
ffmpeg
http://privatepaste.com/3796d4a478
Posted by ロベルト at 2012年04月15日 21:10
cd libaacplus-2.0.2
./autogen.sh \
--prefix="/mingw/i686-pc-mingw32" \
--build="i686-pc-mingw32" \
--host="i686-pc-mingw32" \
--disable-shared --enable-static --enable-fast-install
make clean && make && make install-strip

cd ffmpeg
PKG_CONFIG_PATH="/mingw/i686-pc-mingw32/lib/pkgconfig" \
./configure \
--target-os="mingw32" \
--arch="x86" \
--cpu="i686" \
--enable-gpl \
--enable-nonfree \
--enable-libaacplus \
〜etc〜
make clean && make -j4

↑こんな感じでmake通りますが...

「fstab」の確認はしましたか?
Posted by X5-452 at 2012年04月16日 00:43
自分はGCCの自ビルドやインストーラー系のインストールが面倒なので以下を使ってます。

PortableGit-1.7.10-preview20120409.7z
http://code.google.com/p/msysgit/downloads/list
MSYS_MinGW_GCC_470_x86-x64_Full.7z
http://xhmikosr.1f0.de/tools/#!/view=details/lang=en/sort=na

msysフォルダ作成
PortableGitをmsysフォルダに解凍
MSYS_MinGW_GCC_470_x86-x64_Fullをmsysフォルダに解凍(全て上書き)
H:\msys\etc にあるfstab.sample
H:/mingw /mingw

H:/msys/mingw /mingw
に変更しfstabで保存。
msys.batを起動。

参考までに...
Posted by X5-452 at 2012年04月16日 01:03
X5-452さん、こんにちは。管理人です。

情報ありがとうございます。

たしかに、msysgitの方にも必要なコマンドが入っていて、オリジナルのMSYSとダブっているので、ムダだなとは思っていました。

X5-452さんのやり方だと、ムダが無くてよさそうですね。

でも、また環境を作り直すのも面倒なので、どうしようか考えます…。
Posted by あべちん at 2012年04月22日 03:20
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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