内蔵AACエンコーダは、まだ実験段階のため、以前使用していたlibfaacや、neroAacEncに比べると音質は良くないです。
まともに動作するようになるまでは、neroAacEncを使用した音声AAC動画の作成方法を、こちらの記事に書きましたので、参考にしてください。
また、x264について、一番多く質問が寄せられるエラーの説明を記事にしましたので、思い当たる方は、ぜひご一読ください。
x264のエンコードでエラー(Error while opening encoder for output stream #0.0)
ffmpeg_bin-30805.zip
ffmpeg_bin_pentium4-30805.zip (Pentium4最適化版)
ffmpeg_bin_core2-30805.zip (Core2最適化版)
ffmpeg_bin_athlon64-30805.zip (Athlon64最適化版)
ffmpeg_bin_phenom-30805.zip (Phenom最適化版)
以下のライブラリをアップデートしました。
libvpx-0.9.6-366
x264 rev.2008
#以前、x264がr1000になった時に記念パーティが開催されていましたが、r2000のパーティはなかったんでしょうかね?
libx264のエンコードでBフレームを使用する場合(-bf 1以上)、rev.29958まではclosed GOPがデフォルトでしたが、rev.30505からopen GOPがデフォルトになっています。
rev.30505以降でエンコードした動画が正常に再生にできない場合、-flags に +cgop を追加して、
-flags +loop+cgop
などどして、closed GOPでエンコードし直してみてください。
libx264のエンコードでも、Bフレームを使用していなければ、気にする必要はありません。
その他、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.0
binutils-2.21
mingwrt-3.18
w32api-3.17
各ライブラリのバージョンは、以下の通りです。
nasm-2.09.08
yasm-1.1.0
pthreads-w32 release 2.9.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
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-366
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 は削除しました。
最適化無し版
--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-memalign-hack --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は、最適化の種類により異なります。
エラーとしては「Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height」で、もちろん
http://blog.k-tai-douga.com/article/34604396.html
は参照しておりまして、この設定で古いバージョンは動きました。あと気になるエラーメッセージとしては、
[libx264 @ 02828000] broken ffmpeg default settings detected
[libx264 @ 02828000] use an encoding preset (e.g. -vpre medium)
[libx264 @ 02828000] preset usage: -vpre <speed> -vpre <profile>
[libx264 @ 02828000] speed presets are listed in x264 --help
[libx264 @ 02828000] profile is optional; x264 defaults to high
というのも出てますし、
[h264 @ 02893280] non-existing PPS referenced
[h264 @ 02893280] non-existing PPS 0 referenced
[h264 @ 02893280] decode_slice_header error
[h264 @ 02893280] no frame!
というのも頻出しております。たぶん、何らかのパラメータ設定の問題であろうと思いますが、ヒントだけでも結構ですので、何か情報頂ければと思います。よろしくお願いします。
解決してよかったです。
また不具合か!?と思って、最近のコメントはドキドキします。
コメントしてくださる皆さんのおかげで解決する問題も多いので、またどうぞ。
libx264: fix open gop default.
Please use -x264opts to force open gop
This fixes Ticket268
http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=d39b33c63bc080231d8d6e79c6301a60b86150de
e:/msys/mingw/i686-pc-mingw32/lib\libmp3lame.a(decode_i386.o): warning: multiple common of `__gnu_lto_v1'
ffmpeg.o: warning: previous common is here
などとエラーが出てしまいます.lameだけでなく全てのライブラリに関して同じエラーが出てしまいます.原因としてはどのようなものが考えられるか教えてていただけないでしょうか?
configureは以下の通りにしています.
PKG_CONFIG_PATH=/mingw/i686-pc-mingw32/lib/pkgconfig ./configure --prefix=/mingw/i686-pc-mingw32 --enable-gpl --enable-version3 --enable-postproc --enable-w32threads --enable-runtime-cpudetect --enable-memalign-hack --enable-avisynth --enable-bzlib --enable-zlib --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libmp3lame --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libx264 --enable-libxvid --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --disable-debug --enable-libschroedinger --extra-libs="-lorc-0.4" --extra-cflags="-march=native -mfpmath=sse -mmmx -msse" --enable-nonfree --target-os="mingw32" --extra-ldflags=-static
libopencore-amrwb, libopencore-amrnb, libmp3lameのライブラリをbuildする時に--extra-cflags="-flto"を入れ、それをffmpegに組み込むと
warning:〜〜〜〜〜`__gnu_lto_v1'〜〜
などのLTO系warningが出たのを覚えてますw
ライブラリのbuildに-fltoを入れなくても、ffmpegのbuildに-fltoを使うとlibopencore-amrwb, libopencore-amrnbがLTO系warningを出すと思います。
Errorでbuildできないって事はなかったですけどね。
GCC4.5.2 or 4.6.0で確認
http://xhmikosr.1f0.de/
http://xhmikosr.1f0.de/
と書きましたが、old版4.6.0です。
新しい4.6.0はLTO入れるとbuild出来ないです。
壊れてるのかなぁ?
ご指摘のとおりgcc側の問題のようです.TDMの4.5.2するとビルド出来ました.x264でOfastがあまり効果がなかったことですし,しばらくは4.5に戻してみますかねえ…
> open gopがデフォルトOFFになりましたねw
あら、-flags +cgopでon/offできなくなっちゃいましたか。
open GOPにしたい時は、
-x264opts open-gop=1
にしましょうということですね。
コロコロ変えるのは勘弁してほしいです…。orz
warning: multiple common of `__gnu_lto_v1'
これは、私も以前に-fltoを試した時、warningが出るだけで、最後までビルドできました。
K4095さんの場合は、エラーでビルドできなかったということでしょうか?
あと、「-Ofast」は「-O3 -ffast-math」と同等で、x264はもともと「-O3 -ffas-math」になっているので、たいして変わらないかもしれません。
ちなみに、以前に試してスピードアップに効果があったのは、
-freorder-blocks-and-partition
でした。
いろいろなオプションを1個ずつオンオフして、最速を目指してみるのも面白いかもしれませんね。
我、多くは語る資質が無くとも、同じ国民として、
影ながら支え合って行ければと思うしだいです。
さて、コンパイル上での区別ですが、
x264上ではジェネリックを基準にしていますよね?
以上です
ffmpeg.exe -i xxx.mp4 -acodec pcm_s16le hoge.wav -vcodec libx264 -an xxx.3gp
のように、WAVと同時に出力すると、映像部分のファイルサイズが2.5倍ぐらいになってしまいます。
ffmpeg 20704では正常ですが、それ以降はすべてこんな調子です。
x264は、
-march=i686 -mfpmath=sse -msse
というフラグがついていますので、Pentium Pro(i686) + SSE で、Pentium III以降なら動くのではないかと思います。
他のライブラリも、コンパイラのデフォルトが、
-march=i686 -mtune=generic
になっています。
20704とはまたずいぶん前の話ですが、直っていないということは、バグとして認識されていないんだと思います。
wavと同時に映像を出力するという使い方をしたことがないのですが、どのような場合に必要なのかなど、参考までに教えていただけませんでしょうか。
WAVと同時出力の利用方法ですが、
映像エンコードをすると同時にWAVを吐き出しておいて、WAVは neroAACなどで利用して、その後mp4boxなどで合成します。
映像と音響を別々に吐き出すより一手間減って時間も短縮できるので以前から利用しておりました。
ものすごく古いffmpeg(10000以前)から利用できたと思いますが、現在のffmpegでは先の報告のようにだめですね。
wavと同時に映像を出力してみたり、2passエンコードと組み合わせたり、いろいろ試してみたのですが、映像部分のファイルサイズが2.5倍ぐらいになるというのが再現できませんでした。
えんちゃんさんのエンコード設定を書いていただければ、私が回答できなくても、どなたか回答してくださるかもしれません。
結果的に自己解決はしました。
2パス目にWAVを吐き出していたものを1パス目に出せば問題は解決するようでした。
ただ、20704以前ではどちらでも問題は発生しませんでした。
自作のプログラムで全てのパラメーターを自動で書き出してエンコードするため2パス目でWAVを吐き出したほうが都合が良い関係でずっとそうしていました。
試した設定は以下のとおりですが、pass 1 pass 2 を逆転してエンコードすればファイルサイズの問題は解決するようです。
ファイルサイズは2倍強になってしまいますが、先にWAVを吐き出せば問題は起きないようです。
ffmpeg.exe -y -i test.mp4 -threads 6 -slices 4 -qmin 2 -qmax 51 -ss 0.0 -vcodec libx264 -idct h264 -coder vlc -level 11 -qcomp 0.7 -qblur 0.5 -complexityblur 20 -mbd 0 -me_method umh -me_range 16 -refs 3 -subq 6 -qns 3 -qdiff 8 -sc_threshold 50 -keyint_min 30 -flags bitexact+qpel+alt+mv4+loop+cgop -trellis 3 -flags2 mixed_refs+wpred+fastpskip+mbtree -wpredp 0 -partitions parti4x4+partp8x8 -rc_eq "blurCplx^(1-qComp)" -cmp chroma -g 90 -deblockalpha 0 -deblockbeta 0 -bt 1536k -i_qfactor 0.714286 -vf "scale=320:240" -sws_flags lanczos -r 29.970030 -b 128k -passlogfile "temp\247039906_28511" -pass 1 -an -aspect 1.3333333333333 -f 3gp "temp\test.3gp"
ffmpeg.exe -y -i test.mp4 -threads 6 -slices 4 -qmin 2 -qmax 51 -ss 0.0 -acodec pcm_s16le -ac 2 -ar 48000 -vol 256 -f wav "test.wav" -vcodec libx264 -idct h264 -coder vlc -level 11 -qcomp 0.7 -qblur 0.5 -complexityblur 20 -mbd 0 -me_method umh -me_range 16 -refs 3 -subq 6 -qns 3 -qdiff 8 -sc_threshold 50 -keyint_min 30 -flags bitexact+qpel+alt+mv4+loop+cgop -trellis 3 -flags2 mixed_refs+wpred+fastpskip+mbtree -wpredp 0 -partitions parti4x4+partp8x8 -rc_eq "blurCplx^(1-qComp)" -cmp chroma -g 90 -deblockalpha 0 -deblockbeta 0 -bt 1536k -i_qfactor 0.714286 -vf "scale=320:240" -sws_flags lanczos -r 29.970030 -b 128k -aspect 1.3333333333333 -passlogfile "temp\247039906_28511" -pass 2 -an -f 3gp "temp\test.3gp"
サンプルに用いた動画は ttp://www.youtube.com/watch?v=m_9cPjQheu4 の360p 板でした。
エンコード中のメッセージを見ると、wavのビットレート1536kというのが、映像の方にも影響しているんでしょうかね?
映像ビットレートが128kだと、確かにファイルサイズが2倍くらいになりました。
500kとか768kとか、もう少し大きくすると、映像とwav同時出力の時と、映像のみ出力の時の差が、あまりなくなりました。
-btはビットレートの変動許容幅なので、-bと同じ値か、-bの2倍位までの値が一般的なようです。
あと、最近のlibx264は、
-rc_eq "blurCplx^(1-qComp)"
は付ける必要がなくなっています。
wavは単体で出力するのが確実だと思いますが、お好みでいろいろお試しください。
決定的な解決方法は無いようですね。
1パス目でWAVを吐き出すのが一番よいようで。
映像ビットレートはとても低ビットレートから高ビットレートまでカバーする必要があるのでなんともなりません。
-rc_eqはもう必要が無いんですね。
実は古い携帯の場合、現在のffmpegではどうしても再生不可能とかなってしまうことが多々ありまして、古い携帯でも再生可能なオールラウンドとなると ffmpeg 18607なんてあたりになってしまいます。
そのあたりにも同じ設定を指定するので、-rc_eqは必要かなと。。
-btの件ありがとうございます。変更してみます。