今回は、libavcodec/libmp3lame.c の不具合で、音声にlameを指定するとエンコードの最後に落ちるという問題と、
AACのデコードにlibfaacが使用されず、FFmpeg内蔵のデコーダーが使用されて、HE-AACが正常にデコード出来ないという問題を修正しました。
Craving Explorerのサポート掲示板の情報と、Craving ExplorerのWiki「同梱ffmpegのlameエンコードの不具合」を参考にさせていただきました。
その他、使い方は今までと変わりません。
ffmpeg_bin_pentium4-16905.zip (Pentium4最適化版)
ffmpeg_bin_core2-16905.zip (Core2最適化版)
ffmpeg_bin_athlon64-16905.zip (Athlon64最適化版)
2013/02/09 削除しました。
以下のライブラリをアップデートしました。
x264 rev.1096
今回より、自前でビルドしたMinGW gcc4.3.3を使用しています。
バイナリはどれを使っても大丈夫だと思いますが、SSE2に対応していないCPU(Sempronの一部など)をお使いの方は、最適化無し版を使ってみてください。
zipファイルを解凍すると、ffmpeg.exeが出てきますので、携帯動画変換君のcoresフォルダに置くなり、単体で使うなりしてください。
pthreadGC2.dllは不要です。
携帯動画変換君のffmpeg.exeとは、オプションの互換性がありませんので、上書きする際はご注意ください。
携帯動画変換君の設定は、こちらの記事を参考にしてください。
FFmpegのコンパイルは、こちらの記事を参考にしてください。
コンパイル環境:MinGW gcc4.3.3
各ライブラリのバージョンは、以下の通りです。
nasm-2.05.1
yasm-0.7.2
pthreads-w32 release 2.9.0
zlib-1.2.3
a52dec-0.7.5-cvs
faac-1.26
faad2-2.6.1
gsm-1.0.12
lame-398-2
libnut-661
libogg-1.1.3
libvorbis-1.2.0
libtheora-1.0
x264 rev.1096
xvidcore-1.2.1
最適化オプションは、以下のようにしています。
configureのオプションに--enable-smallを付けると、gccのオプションに-Osが付き、-O4にしても無駄なことが分かりましたので、-O4は外しました。
--enable-smallを付けなければ、gccのオプションに-O3が付きます。
最適化無し版
--extra-cflags="-mtune=generic -mno-sse2"
Pentium4最適化版
--extra-cflags="-mtune=pentium4 -mfpmath=sse -msse"
Core2最適化版
--extra-cflags="-mtune=core2 -mfpmath=sse -msse"
Athlon64最適化版
--extra-cflags="-mtune=athlon64 -mfpmath=sse -msse"
configureオプションは以下の通りです。
$ ./configure --enable-memalign-hack --enable-postproc --enable-swscale --enable-gpl --enable-libfaac --disable-decoder=aac --enable-libfaad --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libvorbis --enable-libtheora --enable-libx264 --enable-libxvid --disable-ffserver --disable-ffplay --enable-avisynth --enable-small --enable-pthreads --extra-ldflags=-static --extra-cflags="-mtune=athlon64 -mfpmath=sse -msse"
※--extra-cflagsは、最適化の種類により異なります。
configureのメッセージはこちら。
ffmpeg修正お疲れ様です!
今回も大事に使わせていただきます
私も何度かffmpegのコンパイルに挑戦しているのですが、ところどころエラーになってしまい、完成には至っておりません(笑
今後、自力でコンパイルできるようにがんばってみます!
avi を変換するときにエラーが出るもので。
http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2008-December/057353.html
http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20081212/61335cf7/attachment.txt
動画変換君でflvからの変換で動画だけ変換して音声はコピーしたいのですが音声のコマンドを-acodec copyとしてもerror 1とでてうまくいきません。
コマンドはどのようにすればいいのでしょうか?
FLVからの変換ということですが、-acodec copy なら 音声はmp3になりますよね。
変換するつもりの形式は何でしょうか?
おそらく、そこが原因だとおもいます。
変換はflvからH.264(mp4)へなのですが、音声をなるべく劣化させないでmp4にしたいのです。
そこでflvから映像だけを変換して音声は変換なしにしたかったのですが、うまくいかなかったので質問させていただきました。
もしかして"音声と映像を分離して映像を変換し音声と合成"という手順じゃないと無理なんでしょうか?
ま〜ちゃるさん
flvの音声部分はmp3で、H.264(mp4)の音声部分はaac(m4a)という決まりがあるので、h.264の動画にmp3の音声という組み合わせは不可能なのです。
エラーが出るのはそれが原因です。
ま〜ちゃるさん
そういうことなので音声をaacに変換するしかありません。
音質を劣化させたくない気持ちはわかりますが。
なるほど、H.264(mp4)の音声はmp3では無理なんですね。勉強になりました。
ダウンロードさせていただき
無事操作することができました。
ありがとうございました!
なにかおかしいんでしょうか?
これなんですが
Command0=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -pass 1 -passlogfile "<%OutputFile%>" -timestamp "<%TimeStamp%>" -flags bitexact -vcodec libx264 -coder 1 -level 30 -bufsize 128 -g 240 -s 480x272 -deinterlace -r 30 -sc_threshold -8000 -cqp 20 -maxrate 1500k -acodec libfaac -ac 2 -ar 48000 -ab 128k -f psp "<%OutputFile%>.MP4""
Command1=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -pass 2 -passlogfile "<%OutputFile%>" -timestamp "<%TimeStamp%>" -flags bitexact -vcodec libx264 -coder 1 -level 30 -bufsize 128 -g 240 -s 480x272 -deinterlace -r 30 -sc_threshold -8000 -cqp 20 -maxrate 1500k -acodec libfaac -ac 2 -ar 48000 -ab 128k -f psp "<%OutputFile%>.MP4""
エンコードの設定よりも、出てきたエラーを貼った方が原因がわかりやすいと思いますよ…
で、エラーの内容を読めばそこに解決方法もあると思います。
Error while opening codec for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height
いつもコメントしていただき、ありがとうございます。
コンパイルの手順を見直して、記事を書き直しましたので、参考にしてみてください。
上手くいくと良いのですが…。
コメントありがとうございます。
リンク先の記事を読んでみたのですが、いまいち理解できませんでした。
エラーの状況なども不明ですので、パッチの適用はしばらく様子見とさせてください。
よろしくお願いします。
なかなかお返事できず、申し訳ありません。
FLVでも音声がMP3でない場合があり、その場合、-acodec copyだと失敗します。
変換後、音が出なくなったりします。
error 1の原因は分かりません…。
音声を再エンコしても良いのであれば、-acodec libmp3lameを指定して、H.264+MP3という動画も可能です。
音声がMP3のFLVなら、音声は再エンコせずに-acodec copyとして、映像部分だけエンコできます。
また、音声がAACのFLVというのも存在します。
FLVやMP4というのはコンテナ(入れ物)のフォーマットの種類なので、映像と音声の組み合わせは色々あります。
詳しくは、この辺りをどうぞ。
http://ja.wikipedia.org/wiki/Flash_Video
http://ja.wikipedia.org/wiki/MP4
コメントありがとうございます。
動作報告、ありがとうございました。
不定期で更新しておりますので、また時々お越し下さいね。
nnsさん、フォローありがとうございました。
test typeさんのオプションで試してみたのですが、確かに、1pass目が終わった後、2pass目で失敗しますね。
直訳すれば、画像のビットレート、(フレーム)レート、画面の幅、高さのいずれかのパラメータが不正かもしれないということですが、何かオプションが不足しているのでしょうか?
また何か分かりしだい、コメントします。
設定の方、拝見しました。-cqp 20 が一番の原因ではないでしょうか?
固定品質や固定量子化係数(-crfと-cqp)を使うと、2pass目で必ずエラーになるようです。
-cqp 20に拘らなければ、ビットレート指定にしてみたらどうでしょうか。
どうしてもq=20にしたいのでしたら、-qcomp 1.0にして-qmin や-qmax を使って制御できるかもしれません。
まちがってたら、ごめんなさい。
Command0=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -title "<%Title%>" -timestamp "<%TimeStamp%>" -flags bitexact -vcodec libx264 -coder 1 -level 30 -bufsize 128 -g 240 -s 480x272 -deinterlace -r 30 -sc_threshold -8000 -qcomp 1.0 -qmin 2 -qmax 20 -maxrate 1500k -passlogfile "<%TemporaryFile%>" -pass 1 -acodec libfaac -ac 2 -ar 48000 -ab 128k -f psp "<%OutputFile%>.MP4""
Command1=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -title "<%Title%>" -timestamp "<%TimeStamp%>" -flags bitexact -vcodec libx264 -coder 1 -level 30 -bufsize 128 -g 240 -s 480x272 -deinterlace -r 30 -sc_threshold -8000 -qcomp 1.0 -qmin 2 -qmax 20 -maxrate 1500k -passlogfile "<%TemporaryFile%>" -pass 2 -acodec libfaac -ac 2 -ar 48000 -ab 128k -f psp "<%OutputFile%>.MP4""
Command2="rm "<%OutputFile%>-0.log""
でやってみました。
エラーがまたでたんですが、設定まちがえているのでしょうか?
ならあとは、-sc_threshold を-8000から80にしてみてください。
一応これでできるとおもいます。
x264の場合、-1で無効 0がデフォルト で-1〜100までが指定範囲です。
mpeg4やxvidとは値が違います。
Command1=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -title "<%Title%>" -timestamp "<%TimeStamp%>" -flags bitexact -vcodec libx264 -coder 1 -level 30 -bufsize 128 -g 240 -s 480x272 -deinterlace -r 30 -sc_threshold -80 -qcomp 1.0 -qmin 2 -qmax 20 -maxrate 1500k -passlogfile "<%TemporaryFile%>" -pass 2 -acodec libfaac -ac 2 -ar 48000 -ab 128k -f psp "<%OutputFile%>.MP4""
これでいいでしょうか?
また同じエラーが出てしまいました。
2passと1passではどのくらい差ができるんでしょうか。
-qmaxの値を大きくしているので、画質は落ちるとは思いますが…
すいません。説明のしかたが悪かったですね。
-sc_threshold 80 でお願いします。-1無効 0デフォルト 1〜100 で、プラスの値が大きくなるほどIフレームをたくさんつかいます。
そし、それでもエラーが出るようでしたら、コレを使ってみてください。
Command0=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -passlogfile "2pass-log" -pass 1 -r 30000/1001 -vcodec libx264 -coder 1 -level 30 -sc_threshold 80 -qcomp 1.0 -qmin 2 -qmax 20 -aspect 16:9 -s 480x272 -acodec libfaac -profile aac_low -ac 2 -ar 48000 -ab 126k -f psp "<%TemporaryFile%>.mp4""
Command1=""<%AppPath%>\cores\ffmpeg2" -y -i "<%InputFile%>" -passlogfile "2pass-log" -pass 2 -r 30000/1001 -vcodec libx264 -coder 1 -level 30 -sc_threshold 80 -qcomp 1.0 -qmin 2 -qmax 20 -aspect 16:9 -s 480x272 -acodec libfaac -profile aac_low -ac 2 -ar 48000 -ab 126k -f psp "<%OutputFile%>.mp4""
Command2="rm "2pass-log-0.log""
Command3="rm "<%TemporaryFile%>.mp4""
一応、私はこれでできましたよ。
PSPでも、問題なく再生しましたし。
それから、2passについてですが。
それほど拘りがなければ必要ないかと、個人的には思っています。
しないよりマシぐらいですね。
できました。
これで動画を楽しめます。
wikipediaなど調べたんですがよくわからなくて。
多い方がいいんでしょうか?
それによって変換の時間とかかわりますか?
Iフレームとは、PフレームやBフレームの元になる一枚の画像のようなフレームで、シークの基点になるなど基準となるフレームです。
基本的にはIフレームが多い方が画質は上がりますが、そのぶんサイズも大きくなります。
大体そんな感じだったと思います。