最新FFmpeg / FAQ


最新FFmpeg へ戻る。

最新FFmpegに関するQ&A

質問する前に にも Q&A 方式で一般的なエラーの対処法があるのでこちらも見てください。 以下は最新FFmpeg向けの暫定 Q&A です。

最新FFmpegに入れ替えると変換するときにクラッシュします

<まず確認すること>

  • コマンド実行に必要なファイル (pthreadGC2.dll とか NicMP4Box, NeroAACEnc 等) がそろっているか
  • iniファイルの記述が間違っていないか
  • 入力ファイルに問題がないか (ffmpegが認識できる形で渡されているか)

<次に試してみるべきこと>

  • 使用するFFmpegのリビジョンを変えてみる
  • こちらなどから自分のCPUにあったビルドをDLしてきて試す ※ 特に古いAMD系CPUの場合は、SSE2を使うビルドだとクラッシュする場合があるらしいのでSSE2なし版を試す
  • エラー番号がでている場合エラー番号でググる ※エラー番号が一致するトラブルの解決策が見つかればラッキー

この手のトラブルは、

  • 自分の PC 環境 (主に CPU の種類とサポートしている拡張命令)
  • 使ってるFFmpegがビルドされた環境 (C コンパイラ・アセンブラ等の種類 & バージョン)
  • 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 -hffmpeg -formats を確認して、ini ファイル内で、 その一覧にないコーデック/フォーマット/オプションを使っているところを修正してください。

FFmpegでx264エンコードをするとビットレートが大幅に指定値をオーバーします

  • -bt オプションをきちんと設定してください ビットレート指定の 1pass や 2pass でビットレートを守らせたい場合は、このオプションを明示的に指定してください。 指定値は -b オプションの値の2〜4倍程度 を目安に (-b 384k だったら、-bt 768k 〜 -bt 1536k 程度)。
  • -qmax の指定値を上げてください qmax (デフォルト31) は動きが激しい動画を低ビットレートでエンコードする場合は大きめに設定してください。 ※ 2pass をやっている場合、-qmax が低すぎることがが原因でビットレートを 守れないと "2pass curve failed to converge" というエラーがます。

FFmpegが指定した最大ビットレートを守ってくれません

  • -qscale or -cqp (x264) でエンコードしている場合はビットレート制限は効きません
  • -bufsize を指定してください bufsize を指定しないと、max/minrate 制限は機能しないので必ず -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 parti4x4+partp8x8 ffmpeg のデフォルトでは 16x16 のモードしか使っていませんので、 上記を追加して利用できるパーティションモードを増やしてください。
  • -rc_eq "blurCplx^(1-qComp)" このオプションはレートコントロールを x264 CLI のデフォルトと同じにします。 ffmpeg のデフォルトである -rc_eq "tex^qComp" は -qcomp が 0.5 付近 (±0.025 くらい) では問題ないのですが、 それ以上変更 (-qcomp 0.7 とか) すると途端にQ値の割り振りがおかしくなるような感じがあります(経験談なので鵜呑みにはしないでください)。 x264 関係のパラメータを細かく弄る場合は -rc_eq "blurCplx^(1-qComp)" も一緒に指定したほうが、 各オプションを x264 CLI と同じ感覚で弄れるので間違いがないと思います。 特に -qcomp をデフォルトの 0.5 から変更 し、かつ 1pass で処理する場合はこのオプションの指定も検討してください。

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 のときのみ)

<参考> x264 CLI のコマンドラインオプションをある程度知っている人向け

以下、ffmpeg の libx264 では指定できないオプションや使えない機能を挙げておきます。

  • --no-dct-decimate
  • --cqm jvt, --cqmfile ※ ffmpeg は flat マトリクス以外は使えません
  • オフィシャルにマージされていない以下のようなパッチによる機能(当たり前ですが)
    • AQ (いわゆる Adaptive Quantization)
    • qns (いわゆる Quantizer Noise Shaping)
    • 2pass vbv の修正パッチ

等。他にもありますが、需要が多そうで ffmpeg で使えない機能の代表例はこのあたりだと思われます。