内蔵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
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は、最適化の種類により異なります。
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を変換する時は何か必要なオプションとかがあるのでしょうか。
「x264 rgb yuv420」でググってみたら、こんなページがありました。
http://nikokara.web.fc2.com/encode2.html
ということで、色が変わってしまうのはx264の仕様だそうです。
ねこさんが、すでにご存じの上でのご質問でしたら、私もこれ以上ののことはわかりません。
x264でqb 0でやった場合は1前後変わる事はあっても昨日挙げた奴ほどではないんですよね。
そしてTMPGEncでは全く同じ色で出力されました。
あとTheoraやWebMに変換しても同じ現象が起きたので、ffmpegの色変換をしている部分に何かあるのかなと…。
qb 0というのは、qp 0のことですか?
qp 0なら、losslessなので劣化しないんだと思います。
ffmpegのlibx264のオプションでは、-cqp 0 でlosslessになります。
TMPGEncが何か特殊な処理をしてるんでしょうかね?
もうちょっと調べてみます。
30805バージョンでWAVと映像を同時出力した場合、ファイルサイズが増えてしまうという報告をさせていただいた者です。
その後ffmpegの出力を見ていて原因がわかりました。
現象自体は低ビットレートで発生します。
私は、-qmax 51 を指定してエンコードしていますが、WAVと同時出力だと -qmaxが勝手にデフォルトの31になってしまうようです。
2パスは関係無かったです。
31以上の低画質なんてと言われるかもしれませんが、携帯の1動画のDLサイズがauだと1.5MB制限とか厳しい関係で、画質よりファイルサイズを優先する必要もありまして、指定したとおりの-qmaxでエンコードされることを望みますが、どうでしょうか?
なるほど、-qmaxの値が原因だったとは気が付きませんでした。
えんちゃんさんの設定では、-qmin、-qmaxが-acodecよりも前にありましたので、-vcodec libx264の後ろにしてみてはいかがでしょうか?
なるほど、qmaxの位置ですか、まったく気が付きませんでした。
ffmpegはオプションの順番が難しいですね。
良いことを教えていただきありがとうございました。
これで、安心してエンコードできそうです。
ffmpeg で -cqp 0 を使ってみましたが、
やはり色が変わってしまいました。
劣化とかそういう部分ではないのでしょうね。
何か判りましたら宜しくお願いします。
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""
アドバイスお願いします。
-map 1.0 -map 0.0
を、Command3のどこかに追加してみてください。
FFmpeg rev.30583のダウンロードページまでは注意書きをしていたのですが、もう皆さん読んだだろうと思って、最近は注意書きを削除してました。
他にも困っている方がいらっしゃるかもしれないでの、こちらの記事にも追記しておきました。
http://blog.k-tai-douga.com/article/29190052.html
お手数をかけました。
管理人さんありがとうございます。
解決して良かったです。
アップデートすると、いつの間にか動作が変わっていたりするので、困ったもんですね。
ではでは。
変換速度向上で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""
助言おねがいいたします><
-i "<%AppPath%>\cores\ffmpeg4 "<%InputFile%>"
↓
-i "<%InputFile%>"
これで如何でしょうか?
私もあまり詳しくないのですが以下のようなことではないでしょうか?
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/
ありがとうございますっ!
ご指摘の部分を消去してみたところ
Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height
このようなエラーが出てくるのですが、
固定ビットレートを入れるってことでしょうか?
ffmpegでx264にエンコードする場合にいくつかのオプションがデフォルトのままだと出るエラーです。
参考:http://blog.k-tai-douga.com/article/34604396.html
古いバージョンでは上の記事のように直接オプションを追記。
最近のバージョンなら、
「-vpre medium -vpre main」
の用にx264のプリセットを指定してあげればおkです。
UNTOさん、優さん、代わりに回答していただきまして、ありがとうございます。
その後、解決されましたでしょうか?
x264は-crfが推奨されているようで、-cqpでエンコードしている例があまり見つかりませんでした。
元ネタは何を参考にされたのか分かりませんが、検索すれば、そのうち解決できると思います。
何でもお答えできるわけではありませんので、ご容赦くださいませ。
お忙しい中いろいろと、ありがとうございますっ
優さんから 教えていただいたURLを参考にしてみたところ エラーは出ず 無事変換できたことを ご報告いたしますっ。
大分前に libx264を指定した場合は-cqpと見たときに作ったまま、中身を少しずつ替えてったので大分ゴッチャになってしまってるのかと(汗
-crfについても調べていきたいと思いますっ
本当にありがとうございました><