2012年07月22日

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

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



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

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 のインストール

MinGW-w64をインストールすると、winpthreadsというPthreadsライブラリが使用できます。
winpthreadsのインストール手順は、以下の記事を参照してください。
winpthreadsのコンパイル&インストール

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
pthreads-w32 release 2.9.1
winpthreads (MinGW-w64) ※pthreads-w32と共存できません。
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-pthreads --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:01 | Comment(13) | TrackBack(0) | FFmpegビルド
この記事へのコメント
初めまして。桃源老師と申します。

最初にお断りしておきますが、私はMacを使っております。なので、アドバイスを戴けるかどうか分からないのですが、誰に相談して良いのかも分からないので、質問します。

ffmpegのコンパイルなのですが、libassを使わない設定では正常にコンパイルできるのですが、libassを使う設定でコンパイルするとlibass.4.dylib、libfribidi.0.dylib、libexpat.1.dylib、libfreetype.6.dylibのライブラリに依存する(otool -Lで依存していることが分かる)バイナリができてしまいます。なぜでしょうか?

手順としては個別ライブラリをコンパイル、字幕関連のライブラリもコンパイルします。
続いてgitでffmpegを入手、こちらに掲載されているパッチのうちffmpeg-20130704.diffでmingwとなっている部分をライブラリがあるパスに置き換えて適用します。
続いてffmpeg-global_opts-20130606.diffパッチも適用します。
あまり意味を理解していませんが、パッチを適用しないとfontconfig not foundとなってconfigureできないのです。

configureは以下のようにしています。

$ ./configure --prefix=/Users/username/Desktop/Work/ffmpeg/product --as=yasm --disable-shared --enable-static --disable-ffplay --disable-ffserver --enable-gpl --enable-pthreads --enable-postproc --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-libspeex --enable-bzlib --enable-zlib --enable-libxavs --enable-version3 --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvpx --enable-libgsm --enable-libopus --enable-libtwolame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libfdk-aac --enable-libfaac --enable-nonfree --enable-filters --enable-runtime-cpudetect --enable-fontconfig --enable-libass --enable-libfreetype

以上、大変長くなりましたが、よろしくお願い致します。
Posted by 桃源老師 at 2013年07月07日 23:55
済みません。もうひとつよろしいでしょうか?

gitで入手したffmpegですが、-c:v libx264 -crf 18ではエンコードできるのに-c:v libx264 -preset slow -crf 18や、-c:v libx264 -profile:v High -crf 18や、-c:v libx264 -level 3.1 -crf 18のいずれでも固まってしまってエンコードできないのですが、何故だかお分かりでしょうか?
Posted by 桃源老師 at 2013年07月08日 00:27
桃源老師さん、はじめまして。管理人です。

configureオプションの違いは、
--extra-ldflags=-static
を付けて強制的にスタティックリンクしている所くらいでしょうか。

他の手段として、ライブラリが.aと.dylib両方インストールされていれば、.dylibの方をリネームするか削除すれば、.aのスタティックライブラリとリンクしてくれるのではないかと思います。


あと、x264のオプションで、固まるというのがどういう状況が分からないのですが、
High Profileにするためには、
-8x8dct 1
というオプションを付ける必要があります。
-8x8dct 1を付けると、-profile:vで何を指定しても、あるいは付けてなくても、High Profileになります。

-levelは、10倍した値を設定する必要があるので、level 3.1なら、
-level 31
になります。

-preset slow で固まる件については分かりません。

いろいろお試しください。
Posted by あべちん at 2013年07月08日 21:27
あべちんさま、早速の回答をありがとうございます。

--extra-ldflags=-staticをつけてffmpegをconfigureしようとしたらできませんでした。

戴いた情報をもとに調べた結果、依存関係が出来るライブラリ.dylibができていたので、これを作らないように各ライブラリのconfigureで--disable-shared --enable-staticを明示してコンパイルしたところass関係の共有ライブラリは作られず、ffmpegも.dylibに依存しないものが出来ました。
どうもありがとうございました。

2点目のx264オプションで固まる、つまりエンコードが行われず「ctrl+c」でffmpegを終了させる必要がある問題は現在調査中です。分かって、役に立つようでしたら、別途書き込みます。
Posted by 桃源老師 at 2013年07月09日 00:37
ffmpeg -i input -c:v libx264にオプションをつけると固まる問題は解決しました。
x264を、こちらのブログエントリーにあった手順でコンパイルし直したところ、問題は解決されました。単純なミスだったようです。(役立つ情報ではないですね)
あとlibx264でのlevel指定は-level 3.1でも-level 31でも使えるようです。

これだけでは申し訳ないので、字幕焼き込み対応について追加情報です。
こちらのブログエントリーではffmpegのconfigureスクリプトにパッチを当てていらっしゃいますよね。
私もそのパッチffmpeg-20130704.diffを当てないとfontconfig not foundでconfigureが止まってしまっていたのですが、問題はfontconfigが作るfontconfig.pcにあると思われます。

http://einguste.hatenablog.com/entry/2013/03/23/131352

のブログエントリーを参考にfontconfig.pcを

Version: 2.10.93
Requires: freetype2 expat(この行を追加)
Libs: -L${libdir} -lfontconfig -liconv(-liconvを追加)

のように修正したところ、パッチなしでもfontconfigのエラーは出なくなりました。

Macで字幕をサポートしたffmpegをスクラッチビルドする手順はないので自分がブログに書こうと思っています。


色々ありがとうございました。
Posted by 桃源老師 at 2013年07月11日 01:38
桃源老師さん

解決してよかったです。

FFmpegのconfigureは、ずっと前から試行錯誤しているうちに、今のようなやり方になったのですが、そろそろ見直した方が良いかもしれませんね。

fontconfig以外にも、pkg-config関係でエラーになるライブラリがあるので、どうしたら良いか考えます。

情報ありがとうございました。
Posted by あべちん at 2013年07月15日 08:57
あべちんさん、お久しぶりです(#^.^#)
桃源老師さん、初めまして。

sed -i -e 's/Libs: -L${libdir} -lfontconfig/Libs: -L${libdir} -lfontconfig -lfreetype -lexpat -liconv/g' /mingw/i686-w64-mingw32/lib/pkgconfig/fontconfig.pc

僕は↑こんな感じにfontconfigのインストール後にsedコマンドで修正してます。

libassも上と同じようにインストール後、sedコマンドで編集してます。
sed -i -e 's/Libs: -L${libdir} -lass -lm/Libs: -L${libdir} -lass -lfribidi -lfontconfig -lexpat -liconv -lfreetype/g' /mingw/i686-w64-mingw32/lib/pkgconfig/libass.pc

fontconfigとassについてはffmpeg-20130704.diffが不要になります。
Posted by Sada_Maru(旧X5-452) at 2013年07月15日 13:45
Sada_Maru(旧X5-452)さま、初めまして。

戴いた情報を元に、libass.pcを修正するようにしました。
ただし、fontconfig、freetype、それにfribidiについてはRequiresに記述があったので、-lexpat -liconvのみ追加しました。

あべちんさま、Sada_Maru(旧X5-452)さま

fontconfig.pcの件はfontconfigのメーリングリストに書き込んだところ、git版で修正されました。git版のビルドは、うまくいかなかったので未確認です。
Posted by 桃源老師 at 2013年07月19日 13:52
X5-452さん、改め、Sada_Maruさん、こんにちは。管理人です。
お久しぶりです。

Sada_Maruさんと桃源老師さんの情報をヒントにさらに調べてみたところ、
Requires.private、Libs.privateなど、*.privateが付く方は、pkg-configのオプションに --static を付ければ良いことが分かりました。

FFmpegのconfigure 998行目辺り、
pkg_libs=$($pkg_config --libs $pkg)
という所に --static を追加して、
pkg_libs=$($pkg_config --libs --static $pkg)
とすれば、*.privateにあるライブラリも読み込まれます。

どうしたら、修正ができるだけ少なくて済むか、他のライブラリでも矛盾しないかなど、もうちょっと検討してみます。
Posted by あべちん at 2013年07月21日 13:05
ご無沙汰しております。

やっとこさ、Mac版のffmpegコンパイルガイドをアップしました。随分遅れました。

> pkg_libs=$($pkg_config --libs --static $pkg)

この件は上記ガイドには反映していません。fontconfig 2.11.0で*.privateが付く所になってしまった部分はfontconfig.pcで2.10.93での修正と同じように修正しています。

ffmpegのconfigureスクリプトをいじるべきなのかどうかは悩むところですね。


さて、今日は別件で質問があります。
ffmpegコンパイルガイドを作成する上で検証しながらビルドしたffmpegにlibblurayをリンクさせました。
しかし、情けないことにlibblurayをffmpegでどう使うのかが分かりません。
お時間がある時で結構ですので、ご教授戴けますでしょうか?

もうひとつ、リンクさせなかったライブラリにlibcdioがあります。
良く分からないのですが、paranoiaがビルドできなかったためです。
このライブラリの用途をご教授戴けますでしょうか?
Mac版の配布用ffmpegにはlibcdioはリンクされていないようなのと、libcdioの説明からWindows向けライブラリかなと想像しています。
Posted by 桃源老師 at 2013年10月29日 14:31
桃源老師さん、こんにちは。管理人です。
お久しぶりです。

libblurayについては、なんと私、ブルーレイドライブを持っていないので、試したことが無いのです(*/∇\*)キャ

そのうち、ブルーレイドライブを買ったら試してみます。


libcdioは、CD(DVD)ドライブレターが「D:」だとすると、音楽CDを入れて、

ffmpeg -y -f libcdio -i D: -acodec libmp3lame -ac 2 -ar 44100 -ab 128k -f mp3 temp.mp3

という感じでmp3にエンコードできたりしたのですが、あまり使い道がなかったので久々に試してみたら、ffmpegがクラッシュしてしまいました。

libcdioのgit版だとクラッシュはしなくなったのですが、エラーでCDのデータを読み込んでくれませんでした。

仮に動いたとしても、そのままだと、CDまるごと1つのファイルになるため、曲の先頭と終わりの時間を指定して切り出す必要があったり、いろいろと面倒です。

いつからクラッシュするようになったのかも分からないのですが、質問も無かったので、ffmpegでlibcdioの機能を使っている人は少ないんだと思います。

CDのリッピングは専用のツールの方が使いやすいので、libcdioは無理に入れなくても良いかもしれませんね。
Posted by あべちん at 2013年11月04日 09:49
あべちんさま。

こんばんは。

お返事ありがとうございます。

そうですか。libcdioは扱いにくいのですね。
取りあえず、自分のガイドからは外しておきます。

libbluray残念です。ネット検索でも出てこなくて。
ブルーレイドライブ貸して上げたいくらいです。(笑)
Posted by 桃源老師 at 2013年11月05日 21:24
桃源老師さん、こんにちは。管理人です。

ブルーレイドライブを貸していただけるというその気持ち、ありがたくいただいておきます(笑

ポータブルなブルーレイドライブが、だいぶ安く出回っているので、そのうち思い切って買ってみます。

また何かわかりましたら、ご報告します。
Posted by あべちん at 2013年11月16日 15:28
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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