2012年07月22日

FFmpegのコンパイル (2012/07/22) w32threads

2014/02/17 追記
ライブラリの追加やconfigureオプションの変更など、全面的に書き直しました。
今後の変更は、新しい記事の方を参照してください。
FFmpegのコンパイル (2014/02/17)



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

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

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

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

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

2013/10/14 追記
MinGW-w64も自分でビルドしてみたい方は、こちらも参考にしてください。
MinGW-w64 v3のビルド

2013/07/29 追記
FFmpegのconfigureと、その他のライブラリのconfigureでもpkg-configが必要なものがありますので、インストールしておいてください。
pkg-configのインストール


3. 個別のライブラリについて
以下のライブラリは、あらかじめインストールしておいてください。
この記事を書いた時点より新しくなっているものもありますので、それぞれの記事で確認してください。

nasm-2.10.09
yasm-1.2.0
zlib-1.2.8
bzip2-1.0.6
libbluray-0.3.0
libcaca-0.99.beta18
libcdio-0.90
libcdio-paranoia-10.2+0.90+1
gsm-1.0.13
libmodplug-0.8.8.4
lame-3.99.5
openjpeg-1.5.1
opus-1.0.3
opencore-amr-0.1.3
vid.stab-0.961
vo-aacenc-0.1.3
vo-amrwbenc-0.1.3
libogg-1.3.1
aoTuV Beta6.03 (libvorbis-1.3.3パッチ)
libtheora-1.1.1
speex-1.2rc1
twolame-0.3.13
libsoxr-0.1.1
libvpx-v1.2.0
wavpack-4.60.1
x264 (make fprofiled)
xvidcore-1.3.2

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

GnuTLSを、PolarSSLの代わりに使用する場合は、以下の記事を参照してください。
gnutls-3.2.2
rtmpdump-2.4 GnuTLS版

OpenSSLを使用する場合は、以下の記事を参照してください。
OpenSSLはGPL非互換なので、GnuTLSかPolarSSLをおすすめします。
openssl-1.0.1e
rtmpdump-2.4

字幕ファイルを読み込むためのライブラリlibassを追加する場合は、以下のライブラリが必要になります。
pkg-config_0.26-1_win32
libiconv-1.14
freetype-2.5.0.1
expat-2.1.0
fontconfig-2.10.93
fribidi-0.19.5
libass-0.10.1

2012/07/29 追記
ffplayをビルドする場合は、SDLが必要になります。
SDLをインストールして、configureオプションの「--disable-ffplay」を削除してください。
SDL-1.2.15

SDLをインストールしていると、configureで、自動でenableになります。
SDLをインストールしていてもdisableにしたい場合は、configureオプションに「--disable-outdev=sdl」を追加してください。


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

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

「git://git.videolan.org/ffmpeg.git」からソースコードをclone済みで、アップデートを繰り返して使用している場合は、以下のコマンドでURLを変更できます。
$ git remote set-url origin git://source.ffmpeg.org/ffmpeg.git

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

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

2014/01/22 追記
vid.stabの関数が変更された件は修正済みのため、パッチを2013/12/21版に戻しました。(rev.59224(3f307d7)〜)
ffmpeg-20131221.diff

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

2013/11/16 追記
「-flags2」用のパッチを更新しました。(rev.58074(b71e4d8)〜)
ffmpeg-global_opts-20131114.diff


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

ダウンロード(git clone)済みのソースコードがある場合、一旦Makefileを全部削除して、改行コードをLFにして作成し直せば、エラーが出なくなります。

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

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

$ patch -p1 < ffmpeg-20131221.diff
$ patch -p1 < ffmpeg-global_opts-20131114.diff

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

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

2013/06/25 追記
configureオプション「--enable-libvidstab」「--enable-libwavpack」を追加しました。

$ ./configure --enable-gpl --enable-version3 --enable-avisynth --enable-fontconfig --enable-libass --enable-libbluray --enable-libcaca --enable-libcdio --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libxvid --disable-outdev=sdl --disable-ffprobe --disable-ffserver --enable-w32threads --extra-ldflags=-static --extra-cflags="-mtune=athlon64 -mfpmath=sse -msse" --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のマニュアルなどを見て研究されると良いかもしれません。

2013/11/04 追記
最適化無し版のconfigureオプションに「--enable-memalign-hack」を追加しました。
これにより、Windows2000でも使えるようになるらしいです。

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

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

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

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

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

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

その他、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より音質が良いと評判のfdk-aacがありますので、fdk-aacをおすすめします。

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

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

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

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

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


【更新履歴】を見る
posted by あべちん at 12:10 | Comment(13) | TrackBack(0) | FFmpegビルド
この記事へのコメント
色々と失礼します。
configureの時に--enable-libcdioを追加するとlibcdioなんて無いよ(ERROR: libcdio not found)って言われてしまいます
libcdioのコンパイル&インストール (libcdio-0.90以降)を参考にコンパイル&インストールは成功してるのですが、何故でしょうか?
色々勉強中の為ご迷惑をお掛けしますがご教授お願いします
Posted by キュアミューズ=裕己 at 2012年12月27日 08:29
キュアミューズ=裕己さん

configureに --extra-libs="-lwinmm" 付け足せばOKだよ。w
Posted by X5-452 at 2012年12月27日 14:53
キュアミューズ=裕己さん、X5-452さん、こんにちは。管理人です。

X5-452さん
代わりに回答していただいて、ありがとうございます。

キュアミューズ=裕己さん
その後、成功しましたでしょうか?
成功した、あるいは、また別の所で引っかかっているなど、ご報告いただけるとありがたいです。
Posted by あべちん at 2012年12月31日 12:07
あべちんさん、X5-452さんありがとうございます。
個人的にX5-452さんさんとTwitterでやり取りしていただき、--extra-libs="-liconv -lwinmm"を教えていただきました所成功しました。
ご迷惑をおかけしました○┓ペコリ
来年も宜しくお願いします
Posted by キュアミューズ=裕己 at 2012年12月31日 18:48
キュアミューズ=裕己さん

解決して良かったです。
これで安心して年を越せます(笑)

こちらこそ、来年もよろしくお願いします。
それでは、良いお年を。
Posted by あべちん at 2012年12月31日 20:21
今日ちょっとリポジトリを再作成しようと思って、
記述ミスを見つけたので一応報告しておきますね。
(誤)
git git://source.ffmpeg.org/ffmpeg.git
(正)
git clone git://source.ffmpeg.org/ffmpeg.git
「2012/09/27 追記 gitのURLが変わりました。」
の修正のときに、cloneが抜けてしまったようです。
Posted by 少佐 at 2013年01月10日 19:56
少佐さん

ご指摘ありがとうございます。
記事を修正しました。

3ヶ月以上も気が付かなかったとは…orz
Posted by あべちん at 2013年01月10日 20:58
記事本文中の方、修正ありがとうございます。
履歴の「2012/09/27 追記」の部分の方も、
あわせて直して頂けると間違い少ないと思います。
よろしくお願いします。
Posted by 少佐 at 2013年01月11日 00:38
少佐さん

コメントありがとうございます。
たしかに見づらいのですが、履歴は間違いも残しておくことに意味があるので、そのままにしておきます。

履歴は自分用なので、たたんで隠す機能があると良いんですけど、どうしたら一番良いか考えておきます。
Posted by あべちん at 2013年01月12日 23:10
了解しました。
履歴のほうも見て変更点とかを追いかけてるので、
何らかの形で見れるのはありがたいと思います。
Posted by 少佐 at 2013年01月13日 01:54
こんにちわ
5/6のパッチの記述が、4/13と同じになってます。
「パッチを更新しました。(rev.51921(d185343)〜)」
Posted by 少佐 at 2013年05月06日 15:23
少佐さん、こんにちは。管理人です。

ご指摘ありがとうございます。

5/6のパッチは、4/13のを少し修正しただけなので、適用できるrev.はそのままにしていました。
紛らわしくてすみません。

気づかないで本当に間違っていることもありますので、あやしい時は、また指摘していただけると助かります。


5/6のパッチに追加で修正したのは、以下の点です。
1) configure
enabled gnutls のrequire_pkg_configをrequireに変更して、必要なライブラリを追加
enabled libquvi のrequire_pkg_configをrequireに変更して、必要なライブラリを追加

2) libavcodec/jpegls.h
extern const uint8_t ff_log2_run[32];
この実体は、libavcodec/bitstream.c に
const uint8_t ff_log2_run[41]
となっているので、libavcodec/jpegls.h の方を
extern const uint8_t ff_log2_run[41];
に修正
Posted by あべちん at 2013年05月06日 19:28
適用可能リビジョンはそのままで、
パッチ内容の修正だったのですね。
解説どうもありがとうございます。
Posted by 少佐 at 2013年05月06日 19:52
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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