2011年06月30日

FFmpeg rev.31072 ダウンロード

FFmpeg最新版(2011/06/29現在)、rev.31072(4d08dfe)のWindows用バイナリを置いておきます。

内蔵AACエンコーダは、まだ実験段階のため、以前使用していたlibfaacや、neroAacEncに比べると音質は良くないです。
まともに動作するようになるまでは、neroAacEncを使用した音声AAC動画の作成方法を、こちらの記事に書きましたので、参考にしてください。

また、x264について、一番多く質問が寄せられるエラーの説明を記事にしましたので、思い当たる方は、ぜひご一読ください。
x264のエンコードでエラー(Error while opening encoder for output stream #0.0)

ffmpeg_bin-31072.zip
ffmpeg_bin_pentium4-31072.zip (Pentium4最適化版)
ffmpeg_bin_core2-31072.zip (Core2最適化版)
ffmpeg_bin_athlon64-31072.zip (Athlon64最適化版)
ffmpeg_bin_phenom-31072.zip (Phenom最適化版)

以下のライブラリをアップデートしました。
libvpx-0.9.6-408

今回より、自前でビルドしたgcc-4.6.1を使用しています。


libx264のエンコードでBフレームを使用する場合(-bf 1以上)、rev.29958まではclosed GOPがデフォルト、rev.30505からrev.30805までopen GOPがデフォルトになっていました。
今回のrev.31072で、またclosed GOPがデフォルトに戻りました。


その他、Xvidのエンコードで、-slices オプションを使えるようにしています。
-vcodec libxvid -threads 2 -slices 4
など、-threads と -slices を組み合わせると、エンコードがちょっと速くなります。


バイナリはどれを使っても大丈夫だと思いますが、SSE2に対応していないCPU(Duron、Sempronの一部、Pentium3など)をお使いの方は、最適化無し版を使ってみてください。

最適化無し版でもエラーが出る場合は、サポート外とします。

zipファイルを解凍すると、ffmpeg.exeが出てきますので、携帯動画変換君のcoresフォルダに置くなり、単体で使うなりしてください。

携帯動画変換君のffmpeg.exeとは、オプションの互換性がありませんので、上書きする際はご注意ください。

FFmpegのコンパイルは、以下の記事を参考にしてください。
FFmpegのコンパイル (2011/04/12) w32threads

コンパイル環境:MinGW gcc4.6.1
binutils-2.21
mingwrt-3.18
w32api-3.17

各ライブラリのバージョンは、以下の通りです。
nasm-2.09.08
yasm-1.1.0
zlib-1.2.5
bzip2-1.0.6
gsm-1.0.13
lame-3.98.4
opencore-amr-0.1.2
vo-aacenc-0.1.1
vo-amrwbenc-0.1.1
openssl-1.0.0d
rtmpdump-2.3
polarssl-0.99-pre5
rtmpdump-2.3 PolarSSL版
libogg-1.2.2
aoTuV Beta6.03 (libvorbis-1.3.2)
libtheora-1.1.1
speex-1.2rc1
libvpx-0.9.6-408
x264 rev.2008 (make fprofiled)
xvidcore-1.3.2

最適化オプションは、以下のようにしています。
configureのオプションに--enable-smallを付けると、gccのオプションに-Osが付きます。
--enable-smallを付けなければ、gccのオプションに-O3が付きます。

いつの間にか修正されて、
warning: dereferencing type-punned pointer will break strict-aliasing rules
というのが出なくなりましたので、-fno-strict-aliasing は削除しました。

--enable-memalign-hack は自動で判別されるようになったので、不要になりました。

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

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"

configureオプションは以下の通りです。
$ ./configure --enable-gpl --enable-version3 --enable-postproc --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libspeex --enable-libvorbis --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libxvid --enable-libvpx --enable-libx264 --disable-ffserver --disable-ffplay --disable-ffprobe --enable-avisynth --enable-small --enable-w32threads --extra-ldflags=-static --extra-cflags="-mtune=athlon64 -mfpmath=sse -msse"

※--extra-cflagsは、最適化の種類により異なります。
posted by あべちん at 06:32 | Comment(19) | TrackBack(0) | FFmpegダウンロード
この記事へのコメント
はじめまして、いつも有難く使わせて頂いております。

ttp://www1.axfc.net/uploader/File/so/65322.zip

上記の無圧縮AVI「AVI_209_213_196.avi」とH264「H264_209_213_196.mp4」を変換した際に色の違いが出てしまいました。
H264の方は赤209緑213青196のままですが、無圧縮AVIは赤214緑211青202になってしまいました。
変換した際のオプションは下記の様になっております。

ffmpeg -y -i "%1" -vcodec libx264 -g 300 -subq 9 -qmin 0 -qmax 0 -qdiff 0 -an %~n1.mp4

H264の方は最初からYUV420に変換されているからな気がしますが、AVIを変換する時は何か必要なオプションとかがあるのでしょうか。
Posted by ねこ at 2011年06月30日 18:55
ねこさん、こんにちは。管理人です。

「x264 rgb yuv420」でググってみたら、こんなページがありました。

http://nikokara.web.fc2.com/encode2.html

ということで、色が変わってしまうのはx264の仕様だそうです。

ねこさんが、すでにご存じの上でのご質問でしたら、私もこれ以上ののことはわかりません。
Posted by あべちん at 2011年07月01日 08:56
なるほど、お答えありがとうございます。

x264でqb 0でやった場合は1前後変わる事はあっても昨日挙げた奴ほどではないんですよね。
そしてTMPGEncでは全く同じ色で出力されました。

あとTheoraやWebMに変換しても同じ現象が起きたので、ffmpegの色変換をしている部分に何かあるのかなと…。
Posted by ねこ at 2011年07月01日 12:00
ねこさん、こんにちは。管理人です。

qb 0というのは、qp 0のことですか?
qp 0なら、losslessなので劣化しないんだと思います。

ffmpegのlibx264のオプションでは、-cqp 0 でlosslessになります。

TMPGEncが何か特殊な処理をしてるんでしょうかね?
もうちょっと調べてみます。
Posted by あべちん at 2011年07月02日 13:00
管理人さん、こんにちは

30805バージョンでWAVと映像を同時出力した場合、ファイルサイズが増えてしまうという報告をさせていただいた者です。

その後ffmpegの出力を見ていて原因がわかりました。
現象自体は低ビットレートで発生します。
私は、-qmax 51 を指定してエンコードしていますが、WAVと同時出力だと -qmaxが勝手にデフォルトの31になってしまうようです。
2パスは関係無かったです。

31以上の低画質なんてと言われるかもしれませんが、携帯の1動画のDLサイズがauだと1.5MB制限とか厳しい関係で、画質よりファイルサイズを優先する必要もありまして、指定したとおりの-qmaxでエンコードされることを望みますが、どうでしょうか?
Posted by えんちゃん at 2011年07月02日 16:50
えんちゃんさん、こんにちは。管理人です。

なるほど、-qmaxの値が原因だったとは気が付きませんでした。

えんちゃんさんの設定では、-qmin、-qmaxが-acodecよりも前にありましたので、-vcodec libx264の後ろにしてみてはいかがでしょうか?
Posted by あべちん at 2011年07月02日 18:34
管理人さん、こんにちは。

なるほど、qmaxの位置ですか、まったく気が付きませんでした。
ffmpegはオプションの順番が難しいですね。
良いことを教えていただきありがとうございました。
これで、安心してエンコードできそうです。
Posted by えんちゃん at 2011年07月02日 18:46
qp 0です、打ち間違えました。

ffmpeg で -cqp 0 を使ってみましたが、
やはり色が変わってしまいました。
劣化とかそういう部分ではないのでしょうね。

何か判りましたら宜しくお願いします。
Posted by ねこ at 2011年07月05日 11:16
以下のコードで動画変換くんで変換しようとすると
Could not write header for output file #0 (incorrect codec parameters ?)
というエラーが出ます。
動画変換自体久しぶりにしたので
http://blog.k-tai-douga.com/article/34604396.html
http://blog.k-tai-douga.com/article/29190052.html
を参考にしたのですが、出来ませんでした・・・

Command0=""<%AppPath%>\cores\ffmpeg" -y -i "<%InputFile%>" -vn -acodec pcm_s16le -ac 2 -ar 48000 "<%TemporaryFile%>.wav""
Command1=""<%AppPath%>\cores\neroAacEnc" -if "<%TemporaryFile%>.wav" -lc -br 160000 -of "<%TemporaryFile%>.aac"
Command2=""<%AppPath%>\cores\ffmpeg" -y -i "<%TemporaryFile%>.aac" -acodec copy -i "<%InputFile%>" -pass 1 -passlogfile "x264_2pass" -vcodec libx264 -flags bitexact -g 150 -qcomp 0.7 -qmin 10 -qmax 51 -qdiff 4 -subq 6 -me_range 16 -i_qfactor 0.714286 -s 640x360 -r 24.00 -b 2500k -f ipod -level 30 -threads 2 "<%OutputFile%>.mp4""
Command3=""<%AppPath%>\cores\ffmpeg" -y -i "<%TemporaryFile%>.aac" -acodec copy -i "<%InputFile%>" -pass 1 -passlogfile "x264_2pass" -vcodec libx264 -flags bitexact -g 150 -qcomp 0.7 -qmin 10 -qmax 51 -qdiff 4 -subq 6 -me_range 16 -i_qfactor 0.714286 -s 640x360 -r 24.00 -b 2500k -f ipod -level 30 -threads 2 "<%OutputFile%>.mp4""
Command4="rm "<%TemporaryFile%>.wav""
Command5="rm "<%TemporaryFile%>.aac""

アドバイスお願いします。
Posted by ま〜ちゃる at 2011年07月05日 12:25
ま〜ちゃるさん、こんにちは。管理人です。

-map 1.0 -map 0.0
を、Command3のどこかに追加してみてください。

FFmpeg rev.30583のダウンロードページまでは注意書きをしていたのですが、もう皆さん読んだだろうと思って、最近は注意書きを削除してました。

他にも困っている方がいらっしゃるかもしれないでの、こちらの記事にも追記しておきました。
http://blog.k-tai-douga.com/article/29190052.html
Posted by あべちん at 2011年07月05日 13:09
出来ました!

お手数をかけました。
管理人さんありがとうございます。
Posted by ま〜ちゃる at 2011年07月05日 23:35
ま〜ちゃるさん、こんにちは。管理人です。

解決して良かったです。
アップデートすると、いつの間にか動作が変わっていたりするので、困ったもんですね。

ではでは。
Posted by あべちん at 2011年07月06日 11:31
neroAACでの音質を上げるのと
変換速度向上でffmpegを最新に上げたのですが、以下のタイミングでエラーが出てしまいます。
動画変換のスクリプトが間違えてると思うのですが、どこを修正したものか わからず書き込みした次第でございます。
C:\video\3GP_Converter034\cores\ffmpeg4 C:\Users\xxx\Desktop\test.mp4 -flags bitexact -vcodec libx264 -coder 1 -level 21 -bufsize 128 -g 240 -s 480x272 -sc_threshold -8000 -cqp 20 -maxrate 1500k -f psp -threads 6 C:\video\test.MP4: Invalid argument
A>Dialog : 処理実行中にエラーが発生しました [Error:1]

以下変換スクリプトです
Command0=""<%AppPath%>\cores\ffmpeg4" -y -i "<%InputFile%>" -vn -acodec pcm_s16le -ac 2 -ar 44100 "<%TemporaryFile%>.wav""
Command1=""<%AppPath%>\cores\neroAacEnc" -if "<%TemporaryFile%>.wav" -lc -br 128000 -of "<%TemporaryFile%>.aac"
Command2=""<%AppPath%>\cores\ffmpeg4" -y -i "<%TemporaryFile%>.aac" -acodec copy -i "<%AppPath%>\cores\ffmpeg4 "<%InputFile%>" -flags bitexact -vcodec libx264 -coder 1 -level 21 -bufsize 128 -g 240 -s 480x272 -sc_threshold -8000 -cqp 20 -maxrate 1500k -f psp -threads 6 "<%OutputFile%>.MP4""
Command3="rm "<%TemporaryFile%>.wav""
Command4="rm "<%TemporaryFile%>.aac""
Command5=""<%AppPath%>\cores\ffmpeg4" -y -i "<%InputFile%>" -f image2 -ss 5 -vframes 1 -s 160x120 -an "<%OutputFile%>.JPG""
助言おねがいいたします><
Posted by こにゃっこ at 2011年07月06日 15:18
スクリプトの Command2 の映像入力(-i)になぜかプログラム(ffmpeg)が入っています。

-i "<%AppPath%>\cores\ffmpeg4 "<%InputFile%>"



-i "<%InputFile%>"

これで如何でしょうか?
Posted by UTNO at 2011年07月07日 01:20
えんちゃんさん、こんにちは。
私もあまり詳しくないのですが以下のようなことではないでしょうか?

YUV(YV12等を含む)は通常フルレンジ(PCスケール = 0〜255)ではなくTVスケール(16〜235?)を使います。
無圧縮RGBの場合は通常フルレンジを使います。
ffmpegの入力でTVスケールとPCスケールの調整を行っているのではないかと思われます。

DVD等をTVで見る時に比べてPCではコントラストが低いように感じたことはありませんか?
またPCで普通に再生できるのにTVではコントラストが高すぎてギラギラしたようになることはありませんか?
このあたりもスケールの違いが原因です。
(20年くらい前にPC画面をTVに表示するコンバータを使った事がありますがコントラスト調整に苦労しました)

TVスケールにはBT.601, BT.709, BT.470, SMPTE170M, SMPTE240M等があり、変換時の係数が違います。
このあたりも色が変化する原因になっているかもしれません。

x264 CLI ではフルレンジなのかを指定する --fullrange on/off というオプションがあります。
ffmpeg では -color_range ではないかと思います。(ソースを見ていないので分かりませんが指定は 0 または 1 と思われます)
また、x264 CLI では --colorprim, --transfer, --colormatrix があり入力の色空間、変換する色空間、再生時の色空間を指定できます。
ffmpeg の -color_primaries, -color_trc, -colorspace が相等するオプションと思われます。

デコーダによっても色が変化します。TVレンジ、PCレンジ変換を行うものと行わないものがあるからです。


DVD では BT.709, SMPTE170M等のカラースペース情報が入っていますが、作成時に間違ったコードを入れているものが多いようです。
作成者や作成会社で色空間の知識が全く無いところもあります。
少し色が変化しますが再生できないわけではないので管理がずさんになっているようです。
また、デコーダで色空間を正確に再生しないものもあります。(市販のDVDプレーヤ等にも不正確なものがあります)


このページのデータ範囲等が参考になると思います。
http://www.marumo.ne.jp/bt601/
Posted by UTNO at 2011年07月07日 06:33
UTNOさん 
ありがとうございますっ!

ご指摘の部分を消去してみたところ
Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height
このようなエラーが出てくるのですが、
固定ビットレートを入れるってことでしょうか?
Posted by こにゃっこ at 2011年07月08日 13:56
> こにゃっこ さん

ffmpegでx264にエンコードする場合にいくつかのオプションがデフォルトのままだと出るエラーです。
参考:http://blog.k-tai-douga.com/article/34604396.html

古いバージョンでは上の記事のように直接オプションを追記。
最近のバージョンなら、
「-vpre medium -vpre main」
の用にx264のプリセットを指定してあげればおkです。
Posted by 優 at 2011年07月10日 13:20
こにゃっこさん、こんにちは。管理人です。

UNTOさん、優さん、代わりに回答していただきまして、ありがとうございます。

その後、解決されましたでしょうか?

x264は-crfが推奨されているようで、-cqpでエンコードしている例があまり見つかりませんでした。

元ネタは何を参考にされたのか分かりませんが、検索すれば、そのうち解決できると思います。

何でもお答えできるわけではありませんので、ご容赦くださいませ。
Posted by あべちん at 2011年07月14日 09:44
UNTOさん 優さん 管理人さん
お忙しい中いろいろと、ありがとうございますっ

優さんから 教えていただいたURLを参考にしてみたところ エラーは出ず 無事変換できたことを ご報告いたしますっ。 

大分前に libx264を指定した場合は-cqpと見たときに作ったまま、中身を少しずつ替えてったので大分ゴッチャになってしまってるのかと(汗

-crfについても調べていきたいと思いますっ
本当にありがとうございました><
Posted by こにゃっこ at 2011年07月14日 20:24
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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