FFmpegにファイルを指定して Could not find codec parameters for stream 0 ... unspecified size(または似たメッセージ)が表示される場合、FFmpegはファイルを開けたものの、ストリームをデコードするのに十分な情報を読み取れていません。この行は警告なので処理は続きますが、あとで別のエラーで止まったり、そのストリームが出力から抜けたりすることがあります。よくある原因は3つあり、それぞれに解決策があります。対処は、手軽なものから確実なものの順に試してください。
FFmpegはファイルを開くとき、各ストリームのパラメータ(解像度・ピクセルフォーマット・サンプルレートなど)を プローブ(探査) するために先頭の小さな塊を読みます。その塊に十分な情報が含まれていないと、たとえコーデック自体は完全にサポートされていても、FFmpegはこのメッセージを表示します。
まず ffprobe でファイルを確認する
オプションを変える前に、FFmpegが実際に何を検出しているかを見ます。ffprobe はストリームと、読み取れたパラメータを報告するので、問題が単一ストリームなのかファイル全体なのかが分かります。
ffprobe input.mp4
出力の中で、重要なフィールドが欠けているストリーム(たとえば解像度の無い映像ストリームや、サンプルレートの無い音声ストリーム)を探します。値の代わりに none と表示されたり、サイズやサンプルレートが無かったりするストリームが、このメッセージの対象です。すべての ストリームが空に見えるなら、ファイルは切れている・破損している可能性が高く、特殊なストリームだけが空なら、特殊なコーデックが原因かもしれません。
原因①: プローブしたデータが少なすぎる
FFmpegは既定で、ストリームパラメータの検出にファイルの限られた量しか読みません。前置きが長い、キーフレームがまばら、メタデータが後方に配置されているファイルでは、デコーダが使えるフレームに届く前に既定の読み取り範囲が終わってしまいます。解決策は、-analyzeduration と -probesize で、ファイルをもっと多くプローブさせることです。
ffmpeg -analyzeduration 100M -probesize 100M -i input.mp4 -c copy output.mp4
-analyzeduration 100M— プローブ中、最大100Mマイクロ秒分のストリームを解析-probesize 100M— プローブ中、最大100MBのデータを読む-c copy— パラメータが見つかったら再エンコードせずコピー
どちらのオプションも入力の開き方に影響するため、-i の 前 に置く必要があります。100Mでも足りない非常に大きい・特殊なファイルでは、値をさらに上げます。最も手軽な対処なので、ファイル自体が無傷ならまずこれを試します。
原因②: ストリームの破損・切れ
プローブ量を増やしても直らない場合、ファイル自体が不完全な可能性があります。途中で止まったダウンロード、書き込み途中で切れた録画、転送中に壊れたバイトなどです。この場合、パラメータを記述するデータがそもそも書かれていない、または壊れているため、FFmpegはパラメータを見つけられません。
こうしたファイルは完全には修復できないことが多いものの、再エンコードして壊れた部分をFFmpegに飛ばさせれば、有効な 部分を救出できることがよくあります。再エンコードすると出力のストリームパラメータが正しく作り直されるので、元のファイルを開けなかったプレーヤーでも結果を開けるようになります。
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac output.mp4
これでも失敗するほど入力がひどく切れている場合は、デコードに必要なデータが本当に欠けています。可能なら元素材を再ダウンロードまたは再エクスポートしてください。関連する破損エラーについては 「Invalid data found when processing input」エラーの解決法 を参照してください。
原因③: 特殊または誤検出されたコーデック
ストリームは正常でも、珍しいコーデックを使っていたり、コンテナのヒントが間違っていたりして、FFmpegのプローブがパラメータをすぐに確定できないことがあります。生ストリーム(コンテナの無い .h264 や .aac)が典型例です。コンテナが無いので、解像度やサンプルレートはストリームの中のヘッダ(H.264 の SPS/PPS、AAC の ADTS ヘッダ)から読み取ります。このヘッダが欠けていると、パラメータを確定できません。
確実な対処の一つは、上と同じ再エンコードです。ffprobe でストリームを読めるなら、再エンコードでFFmpegに完全にデコードさせ、標準的なストリームとして標準MP4に書き出すことで、出力のコーデックパラメータを正規化できます。
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac output.mp4
-c:v libx264— 映像をクリーンなパラメータでH.264に再エンコード-c:a aac— 音声をAACに再エンコード
再エンコード後の出力は標準的なパラメータを持つため、そのファイルでは同じエラーは出ません。ただし生(raw)や特殊な入力では再エンコードだけでは足りず、入力のフォーマット・解像度・フレームレートを明示する必要があることもあります(例: -i の前に -f rawvideo -pix_fmt yuv420p -s 1920x1080 -r 30)。入力コーデック自体がビルドでサポートされていない場合は別の問題です。FFmpegのコーデックエラー を参照してください。
まとめ
| 原因 | 症状 | 解決策 |
|---|---|---|
| プローブ量が少なすぎる | 無傷のファイル、開く時にエラー | -i の前に -analyzeduration 100M -probesize 100M |
| ストリームの破損・切れ | ダウンロードや録画が途中で切れた | 再エンコードで救出。必要なら元素材を再取得 |
| 特殊・誤検出コーデック | 生ストリームや変則コンテナ | 標準MP4へ再エンコード |
| まず診断 | ストリームごとにフィールド欠落 | ffprobe input.mp4 |
よくある質問
analyzeduration と probesize は -i の前後どちらに置きますか
-i の前です。これらはファイルの開き方とプローブを制御する 入力 オプションなので、適用したい入力より前に置く必要があります。-i の後に置いてもプローブには効きません。
probesize を100Mにしてもまだ失敗します。次にどうすれば
その場合、ファイルはプローブ不足ではなく切れている・破損している可能性が高いです。再エンコードのフォールバック ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac output.mp4 で有効な部分を救出してみてください。それすら失敗するなら、ストリームのデコードに必要な元データが本当に欠けています。
このエラーはFFmpegにコーデックが無いという意味ですか
たいていは違います。「Could not find codec parameters」はストリームの設定をプローブする話で、FFmpegが対応しているコーデックでも出ます。ただし行の末尾が unknown codec で、コーデック名の位置に none と表示されている場合は、FFmpegがそのコーデックを認識できていません。FFmpegのコーデックエラー を参照してください。どのストリームが読めないかは ffprobe で確認してください。
ffprobe でストリームは見えるのにパラメータが出ないのはなぜですか
原因は同じプローブ不足です。FFmpegはストリームの存在は検出したものの、解像度やサンプルレートなどを埋めるだけのデータを読めていません。-analyzeduration と -probesize を増やすか、再エンコードすれば、たいてい出力にこれらのパラメータが埋まります。生(raw)や特殊な入力では、入力のフォーマット・解像度・フレームレートを明示する必要がある場合もあります。