FFmpeg最新版(2011/09/29現在)、rev.33094(ecf31a6)のWindows用バイナリを置いておきます。
内蔵AACエンコーダは、まだ実験段階のため、以前使用していたlibfaacや、neroAacEncに比べると音質は良くないです。
まともに動作するようになるまでは、neroAacEncを使用した音声AAC動画の作成方法を、こちらの記事に書きましたので、参考にしてください。
また、x264について、一番多く質問が寄せられるエラーの説明を記事にしましたので、思い当たる方は、ぜひご一読ください。
x264のエンコードでエラー(Error while opening encoder for output stream #0.0)
ffmpeg_bin-33094.zip
ffmpeg_bin_pentium4-33094.zip (Pentium4最適化版)
ffmpeg_bin_core2-33094.zip (Core2最適化版)
ffmpeg_bin_athlon64-33094.zip (Athlon64最適化版)
ffmpeg_bin_phenom-33094.zip (Phenom最適化版)
以下のライブラリをアップデートしました。
rtmpdump-2.4-20110925
x264 rev.2085
当サイトのrev.32736以降、オプションが若干変わりました。
・-mapオプション
DVDのVOBファイルから、neroAacEncとlibx264またはlibxvidcoreの組み合わせでエンコードした場合に、
-map 1.0 -map 0.0
と指定する必要がありましたが、無くてもエラーが出なくなりました。
特に指定したい場合は、
-map 1:v -map 0:a
と、オプションの書式が変わりました。
・-acodec copy
""<%AppPath%>\cores\ffmpeg" -y -i "<%TemporaryFile%>.aac" -acodec copy -i "<%InputFile%>" -vcodec libx264 ...
という感じで、「-acodec copy」が「-i "<%InputFile%>"」の前にある場合、今までは問題なかったのですが、今回より「-i "<%InputFile%>"」の後ろに「-acodec copy」を置かないと、音声が正常にコピーされなくなってしまいました。
修正後は、
""<%AppPath%>\cores\ffmpeg" -y -i "<%TemporaryFile%>.aac" -i "<%InputFile%>" -acodec copy -vcodec libx264 ...
となります。
・-wpredpオプション
libx264でエンコードする時の「-wpredp」オプションが、「-weightp」になりました。
「-wpredp」を使用していなければ、気にしなくても良いです。
バイナリはどれを使っても大丈夫だと思いますが、SSE2に対応していないCPU(Duron、Sempronの一部、Pentium3など)をお使いの方は、最適化無し版を使ってみてください。
最適化無し版でもエラーが出る場合は、サポート外とします。
zipファイルを解凍すると、ffmpeg.exeが出てきますので、携帯動画変換君のcoresフォルダに置くなり、単体で使うなりしてください。
携帯動画変換君のffmpeg.exeとは、オプションの互換性がありませんので、上書きする際はご注意ください。
FFmpegのコンパイルは、以下の記事を参考にしてください。
FFmpegのコンパイル (2011/07/31) w32threads
コンパイル環境:MinGW gcc4.6.1
binutils-2.21.53
mingwrt-3.20
w32api-3.17
各ライブラリのバージョンは、以下の通りです。
nasm-2.09.10
yasm-1.1.0
zlib-1.2.5
bzip2-1.0.6
libcdio-0.83git-6d907af
gsm-1.0.13
lame-3.98.4
opencore-amr-0.1.2
vo-aacenc-0.1.1
vo-amrwbenc-0.1.1
polarssl-1.0.0
rtmpdump-2.4-20110925 PolarSSL版
libogg-1.3.0
aoTuV Beta6.03 (libvorbis-1.3.2)
libtheora-1.1.1
speex-1.2rc1
libvpx-v0.9.7-p1-33
x264 rev.2085 (make fprofiled)
xvidcore-1.3.2
最適化オプションは、以下のようにしています。
最適化無し版
--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-libcdio --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-w32threads --extra-ldflags=-static --extra-cflags="-mtune=athlon64 -mfpmath=sse -msse" --optflags="-O2 -finline-functions"
※--extra-cflagsは、最適化の種類により異なります。
2011年09月30日
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/48248443
※言及リンクのないトラックバックは受信されません。
この記事へのトラックバック
http://blog.sakura.ne.jp/tb/48248443
※言及リンクのないトラックバックは受信されません。
この記事へのトラックバック
この場合core2を使えばいいですか?
実は、どれを使っても大した違いはないのですが、core2版が一番近いと思います。
だいぶ前に雑誌に掲載された時は、最適化無しの方が速いという結果になっていたので、いろいろお試しください。
こんばんニャ(=^∇⌒=)ノ
ffmpeg_bin_core2-33094 は
とても綺麗にエンコ出来ますね(=^・^=)ノ
今までの ffmpeg では顔の輪郭が少し滲んでいましたが
ffmpeg_bin_core2-33094 はとても綺麗でね!!!
ありがたく使わせていただいておりますffmpegですが、31420までは問題なかったのですが、それ以降のffmpegでx264のエンコードをするとビデオのエンコード部分で落ちるようになりました。
ちなみにmpeg-psへエンコードすると全く問題ないのでソース動画の問題ではないと思われます。
何か参考になるものがありましたらご指南いただけると助かります。
以下、エラーの発生する部分のログの抜粋です
一部個人情報になる部分は XXXにしてあります
環境情報
OS : Windows7 SP1(32bit)
CPU Core i5
E>"D:\winap\3GP_Converter034\cores\ffmpeg-33094" -threads 2 -y -i "E:\video\星空.ts" -timestamp "2011-05-12 20:22:00" -deinterlace -pass 1 -passlogfile C:\Users\XXX\AppData\Local\Temp\05F21A79-962D9652-A0CDD9BD-7022F00E -vcodec libx264 -coder 1 -flags bitexact -flags2 +mbtree -g 150 -qcomp 0.7 -qmin 10 -qmax 51 -qdiff 4 -subq 6 -me_range 16 -i_qfactor 0.714286 -s 1920x1080 -r 29.97 -vb 5000k -aspect 16:9 -an -f mp4 "C:\Users\XXX\AppData\Local\Temp\05F21A79-962D9652-A0CDD9BD-7022F00E.mp4"
ffmpeg version N-33094-gecf31a6, Copyright (c) 2000-2011 the FFmpeg developers
built on Sep 30 2011 03:14:12 with gcc 4.6.1
configuration: --enable-gpl --enable-version3 --enable-postproc --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libcdio --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-w32threads --extra-ldflags=-static --extra-cflags='-mtune=core2 -mfpmath=sse -msse' --optflags='-O2 -finline-functions'
libavutil 51. 18. 0 / 51. 18. 0
libavcodec 53. 18. 0 / 53. 18. 0
libavformat 53. 13. 0 / 53. 13. 0
libavdevice 53. 4. 0 / 53. 4. 0
libavfilter 2. 43. 6 / 2. 43. 6
libswscale 2. 1. 0 / 2. 1. 0
libpostproc 51. 2. 0 / 51. 2. 0
[mpeg2video @ 029f9400] mpeg_decode_postinit() failure
Last message repeated 10 times
[NULL @ 02a057e0] start time is not set in estimate_timings_from_pts
[mpegts @ 029de4e0] PES packet size mismatch
Input #0, mpegts, from 'E:\video\譏溽ゥコ.ts':
Duration: 00:10:07.41, start: 59631.011544, bitrate: 20042 kb/s
Program 103
Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 24000 kb/s, 35.16 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0:1[0x110]: Audio: aac ([15][0][0][0] / 0x000F), 48000 Hz, stereo, s16, 255 kb/s
Stream #0:2[0x130]: Unknown: none ([6][0][0][0] / 0x0006)
timestamp is deprecated, set the 'creation_time' metadata tag instead.
No '=' character in metadata string .
A>Dialog : 処理実行中にエラーが発生しました [Error:1]
T>Finished.
しばらく旅に出ていました。
x264 rev.2085になって、何か改良されたのでしょうかね?
携帯用の小さいサイズでしか試していなかったので、違いに気が付きませんでした。
ご報告ありがとうございました。
こちらの記事の、soleilさんのコメントに対して書いた内容と同じかもしれません。
http://blog.k-tai-douga.com/article/48057248.html#comment
「-timestamp」の代わりに、「-metadata creation_time」を設定してみてください。
管理人さん
こんばんニャ(=^∇⌒=)ノ
>旅に出ていました。
ハワイでお昼寝かな???
(=^艸^=)
ビットレートを240ぐらいでエンコすると
違いが解りますよ(=^・^=)ノ
x264 rev.2085は今まで中で一番綺麗でつ!!!
早々のご回答ありがとうございます。
該当コメントに気づいていませんで多重質問になったようで失礼しました。
とりあえずエラーは収まりましたので調整等行なっていきたいと思います。
ありがとうございましたm(__)m
>>旅に出ていました。
>
>ハワイでお昼寝かな???
いえいえ、そんなリッチなものではないですよ。
国内ですが、行き先は秘密です。
それはさておき…
比べてみたら、確かに、x264 rev.2074よりrev.2085の方が、細かい線もちゃんと出てる感じがします。
x264の開発に携わっている人はエライですね。
他の記事のコメントなので、見つけにくいですね。
同じ問題で困っている方は、他にもけっこういらっしゃるのかもしれません。
とりあえず、解決して良かったです。
-vb 5000kで1440x1080(16:9)をエンコードしたらエンコード時間が従来の倍になった代わりに、圧縮率が物凄く上がるようになりました。
画質自体は従来と変わらないぐらいですね。
最終的に2000kまで圧縮されてます。
他の動画でどうかはまだ確認してませんが、オプションが無視されているからなのか別の理由なのか色々と動画をエンコードしてみます。
リンクを参照していただけると幸いです。
リンク先の記事、拝見しました。
いつも800kbps位でエンコードしているので、気が付きませんでした。
オプションのデフォルト値が、以前と変わったりしていないかなど、時間がある時に試してみます。
上記の(私のサイトも含めて)状態になるのはアニメ関係の場合のみのようですね。
実写などは、圧縮率が悪くなると逆に容量が増える場合があるようです。
FHD(1440x1080/1920x1080)の実写を3000K指定でエンコードすると3M以内に収まらず、3.5〜4.5MのH264動画に仕上がります。
(代わりに圧縮された動画とは思えないぐらい綺麗な動画になりますが)
また、エンコードにかかる時間も元動画の2倍というより約3倍ぐらいの時間がかかってます。
2pass指定していることも関係あるとは思いますが、一番大きく時間がかかるようになったのが、圧縮済動画とAAC音声(neroAacEncでエンコード)の合成処理の時も同じ時間がかかっている為です。
ここについては、推定になりますが従来のffmpegがノーチェックで合成していたものを、音ズレを軽減するために何らかのチェックが入るようになったためではないかと思います。
(まだ、自分もffmpegのhelpなどを読んでいないので新しいオプションが増えているのかも知れませんが)
一応、念のために自分が使用しているスクリプトを残します。他の方の参考になれば嬉しいです。
(1920x1080/3000k専用です)
Command0=""<%AppPath%>\cores\ffmpeg-33094" -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\ffmpeg-33094" -threads 4 -y -i "<%InputFile%>" -metadata creation_time="<%TimeStamp%>" -deinterlace -pass 1 -passlogfile <%TemporaryFile%> -vcodec libx264 -coder 1 -flags bitexact -flags2 +mbtree -g 150 -qcomp 0.7 -qmin 10 -qmax 51 -qdiff 4 -subq 6 -me_range 16 -i_qfactor 0.714286 -s 1920x1080 -r 29.97 -vb 3000k -aspect 16:9 -an -f mp4 "<%TemporaryFile%>.mp4""
Command3=""<%AppPath%>\cores\ffmpeg-33094" -threads 4 -y -i "<%InputFile%>" -metadata creation_time="<%TimeStamp%>" -deinterlace -pass 2 -passlogfile <%TemporaryFile%> -vcodec libx264 -coder 1 -flags bitexact -flags2 +mbtree -g 150 -qcomp 0.7 -qmin 10 -qmax 51 -qdiff 4 -subq 6 -me_range 16 -i_qfactor 0.714286 -s 1920x1080 -r 29.97 -vb 3000k -aspect 16:9 -an -f mp4 "<%TemporaryFile%>.mp4""
Command4=""<%AppPath%>\cores\ffmpeg-33094" -y -i "<%TemporaryFile%>.mp4" -vcodec copy -i "<%TemporaryFile%>.aac" -acodec copy -async 95 -f mp4 "<%OutputFile%>.mp4""
Command5="rm "<%TemporaryFile%>.wav""
Command6="rm "<%TemporaryFile%>.aac""
Command7="rm "<%TimeStamp%>""
Command8="rm "<%TemporaryFile%>.mp4""
Command9="rm "<%TemporaryFile%>""
Command10="rm "<%TemporaryFile%>.mbtree""
ご報告ありがとうございます。
いろいろ試してみたのですが、「-flags bitexact」だと、「-pass 1」「-pass 2」が有効にならないですね。
フラグの先頭に「+」を付けて、「-flags +bitexact」にしてみてください。
携帯動画変換君のログウインドウを表示して、
Stream #0:0: Video: h264 ...
という行に「pass 1」「pass 2」が表示されているか、確認してみてください。
あと、いつからか「-acodec copy」「-vcodec copy」オプションの位置によって、動作が変わってしまっています。
最後の結合時に、
Stream mapping:
Stream #0.0 -> #0.0 (h264 -> libx264)
Stream #1.0 -> #0.1 (copy)
などとなっていたら、映像が再エンコされて、時間がかかっているんだと思います。
Command4の「-vcodec copy」を、「-acodec copy」の直前に移動してみてください。
Stream mapping:
Stream #0.0 -> #0.0 (copy)
Stream #1.0 -> #0.1 (copy)
と、2つとも(copy)になっていればOKです。
あと、「-passlogfile」オプションは、だいぶ前からだと思いますが、ちゃんと効いていなくて、携帯動画変換君がインストールされているディレクトリに、
x264_2pass.log.mbtree
x264_2pass.log
というファイルが作られます。
ご参考まで。
ご丁寧な回答有難う御座います
ご指摘のところは修正しました
今エンコード中なので終わったら試してみようと思います。
また、
Stream mapping:
Stream #0.0 -> #0.0 (h264 -> libx264)
Stream #1.0 -> #0.1 (copy)
ビンゴです。
ただ、-passlogfileは中身がどうかはわかりませんが%temp%を圧迫していますので、一応削除コマンドまで投入している次第です。
本件がうまく行けば、次のバージョンを試してみようと思います。
ありがとうございますm(__)m
やり方お願いします><
その後、何か進展はありましたでしょうか?
一瞬出てくる黒い画面は、訓練しだいで、何が書いてあるか読めるようになりますよ!
私も読めるようになるまで、大変苦労しました。
というのは冗談ですが…。
FFmpegは、何か目的を達成するためのツールです。
MobileHackerzさんのサイトを始め、使い方を説明しているサイトはたくさんありますので、まずそういった所に書いてあるやり方を試してみてください。
読んでもよくわからなかったという場合は、FFmpegが、zakiさんの目的にかなうツールでないということもあり得ます。
「ここまで試してこんな結果になったけど、ここが分からない!」
という場合は、お力になれるかもしれませんので、またご質問していただければ幸いです。