最新FFmpeg へ戻る。
最新FFmpegに関するQ&A †
質問する前に にも Q&A 方式で一般的なエラーの対処法があるのでこちらも見てください。
以下は最新FFmpeg向けの暫定 Q&A です。
最新FFmpegに入れ替えると変換するときにクラッシュします †
<まず確認すること>
- コマンド実行に必要なファイル (pthreadGC2.dll とか NicMP4Box, NeroAACEnc 等) がそろっているか
- iniファイルの記述が間違っていないか
- 入力ファイルに問題がないか (ffmpegが認識できる形で渡されているか)
<次に試してみるべきこと>
- 使用するFFmpegのリビジョンを変えてみる
- こちらなどから自分のCPUにあったビルドをDLしてきて試す
※ 特に古いAMD系CPUの場合は、SSE2を使うビルドだとクラッシュする場合があるらしいのでSSE2なし版を試す
- エラー番号がでている場合エラー番号でググる
※エラー番号が一致するトラブルの解決策が見つかればラッキー
ffmpeg の更新によって新しいバグが埋め込まれることもあります。このような場合は利用するリビジョンを
若干古いものに戻してみてください (戻しすぎるとオプションの書式が変わって泣きを見ることがあります)。
また、複数のリビジョンのビルドでまったく同じタイミングでクラッシュが起こる場合は、別の配布元から
ffmpeg を入手してみてください。
最新FFmpegに入れ替えるとポータブル機器で再生できないファイルができます †
FFmpegを入れ替えた結果、正常に再生できないファイルが出来てしまった場合は、
入れ替えたFFmpegに問題があるか、iniファイルの内容が間違っているかのどちらかです。
- FFmpegの問題の場合 → ひとつ上と同じです
- iniファイルの問題の場合 → 機器の仕様をマニュアルや製品Webサイトで確認して、
対応したフォーマットの動画になるように ini を修正してください
最新FFmpegに入れ替えると以下のようなエラーメッセージが出ます †
- Unknown encoder 'xxx'
- Unknown input or output format: 'xxx'
- ffmpeg: unrecognized option 'xxx'
使っているFFmpegに実装されていないコーデック/フォーマット/オプションを指定しているのが原因です。
最新FFmpeg のページにあるとおり、一部のオプションは変換君同梱のFFmpegに固有の拡張オプションです。
コマンドプロンプトで ffmpeg -h と ffmpeg -formats を確認して、ini ファイル内で、
その一覧にないコーデック/フォーマット/オプションを使っているところを修正してください。
FFmpegでx264エンコードをするとレートコントロール (エンコード中に表示されるq値) がおかしい †
とりあえず現行の ffmpeg で -vcodec libx264 を指定してエンコードする場合は -rc_eq "blurCplx^(1-qComp)" というオプションを入れてください。
こっちが x264 ライブラリの本来のデフォルト値で、ffmpeg のデフォルト ("tex^qComp") は MPEG2 等の libavcodec の内部に実装されているコーデック向けのデフォルト値です。
内部処理の都合上、-rc_eq を指定しないと x264 のデフォルト値とは異なる ffmpeg のデフォルト値で無条件に上書きされてしまいます。
(このオプションはコーデックの開発者が実験目的で変更できるようにするために用意されているものですので、
通常の利用ではコーデックの開発元がセットしているデフォルト値からむやみに変更されるべきではないオプションです。)
※将来的には x264 側でこのオプション自体がなくなるらしいので、上記の問題はそのうち解決されるかも
http://mailman.videolan.org/pipermail/x264-devel/2008-August/004832.html
※ x264 の rev.952 で --rceq オプションは廃止されました。またffmpeg側でも、
r15029 でこの仕様変更に対応しています。
従って rev.952 以降の x264 がリンクされた rev.15029 以降の ffmpeg では
上記の問題は関係ありません。それ以前のrevの場合は依然として影響を受けます。
FFmpegでx264エンコードをするとビットレートが大幅に指定値をオーバーします †
- -bt オプションをきちんと設定してください
ビットレート指定の 2pass でビットレートを守らせたい場合は、このオプションを明示的に指定してください。
指定値は -b オプションと同じ値 を目安に (-b 384k だったら -bt 384k も一緒に指定)
- -qmax の指定値を上げてください
qmax のデフォルト31は低ビットレートでエンコードするにはやや小さい場合があります (ソースとビットレートによる)。
この場合は -qmax を大きめに設定してください。
※ 2pass をやっている場合、-qmax が低すぎることがが原因でビットレートを守れないと
"2pass curve failed to converge" というエラーがます。
FFmpegが指定した最大ビットレートを守ってくれません †
- -qscale or -cqp (x264) でエンコードしている場合はビットレート制限は効きません
- -bufsize を指定してください
x264 の場合は bufsize を指定しないと、maxrate 制限は機能しませんので 必ず -bufsize も指定してください。
bufsize の値は、使っている機器についての最適値が知られている場合はその値を、最適値がわからない場合は
適当に設定してポータブル機器で問題なく再生できる範囲を探してください。
FFmpegでx264エンコードすると以下のような症状がでます †
<シーンチェンジの際に盛大にブロックノイズがでる>
- 以下のオプションを調節してみてください (Iフレーム関係)
- -g, -sc_threshold, -keyint_min
特に -sc_threshold と -keyint_min のオプションを調整することで相当程度改善することが可能です。
またシーンチェンジ検出とはあんまり関係ないですが、-g の値は少なくとも -keyint_min よりは大きくしてください。
※ ffmpeg のデフォルトだと自動でシーンチェンジを検出してIフレームを挿入するようになってませんので、
シーンチェンジをまたいで参照が行われると途端に画質が悪くなります。
特にシーンチェンジのような動きがある部分では P は q 値も高めのものが選択されるので余計にその傾向が顕著です。
<動きの大きなシーンで絵が破綻する>
- -qmax の指定値を下げてください
特に1passは一発勝負なので、動きの大きいシーンが続くとその周辺だけ妙に高いq値 (30後半とか) を
適用してしまうことがあります。これを防ぎたい場合は -qmax を低め (30〜36程度) にしてください。
※ ビットレート指定の 1pass で -qmax を下げすぎると上のほうで書いた「ビットレート指定を守らない」という問題が
再浮上する可能性があります。その辺はソースと求める品質によって加減してください。
<真っ黒な画面がグレー (モヤがかかったような感じ) になる>
- -qmin をデフォルトの2ではなく上げてください
ffmpegのデフォルトである -qmin 2 はトラブルの元です。x264を使う場合は-qmin 10 を基本として考えてください。
<その他画質の破綻に効果が期待できるオプション>
- -patritions オプション全般
ffmpeg のデフォルトでは 16x16 のモードしか使っていませんので、-partitions を追加して
利用できるパーティションモードを増やしてください。
- Baseline Profile の場合: parti4x4+partp8x8(+partp4x4)
- Main Profile で B フレームを使う場合: 上記にプラスして partb8x8
を指定するとよいです。
x264 を使う場合の level オプションの指定について †
level は内部で int 型で処理されている都合上、1.3 等を指定すると小数点以下が切り捨てられて 1 として扱われます。
従って、基本的には 指定したいレベルを10倍した整数値 で指定してください。
例えば、Level 1.3 にしたかったら、-level 13 を指定します。
一部の整数型オプションに文字列を指定してもエラーにならない †
例えば、-directpred は int 型のパラメータですが、x264 本家の CLI フロントエンドと同じ感覚で
"-directpred auto" のように文字列を指定してしまってもエラーはでません
しかしこの指定は実際には "-directpred 0" (none) と同じ扱いになります。
auto 相当にしたい場合は 、"-directpred 3" が正しい指定です。
このように、オプションによっては Help で表示される型とは異なる指定をしてもエラーが出ないことがありますが、
だからといって 指定した値が内部でこちらの意図したとおりに取り扱われているとは限りません。
Help でエイリアス (-coder の ac とか vlc みたいな別表記) が明示されているもの以外のオプションについては
なるべく Help で表示される型で指定したほうが間違いがないです。
エンコードにすごく時間がかかります †
<まず基本>
- 時間がかかるのがいやな場合は 2pass はやらない
- CPUがあまりに非力な場合はCPU乗せ換え・PC買い替えを検討
<デュアルコア以上のCPU (Pentium4 系の HT ではほとんど変わりません) を載せている場合>
以下を指定してみるとマルチスレッド化されて多少高速化するかもしれません (コーデックによる)。
x264 と xvid ではそこそこの速度向上が見られました。
- x264利用時 → -threads 0 を指定
- その他Codec利用時 → -threads 2 (CPUのコア数と同じか+1くらい。無駄に大きい値を指定しても意味ありません)
<エンコードが重くなるオプションを調節する>
- xvid の場合は主に以下のオプション
- -mbd, -flags trell, -me_method, -qns
- x264 の場合は主に以下のオプション
- -refs, -me_method, -subme, -me_range (-me_method umh のときのみ)