出力ファイルに何も書き込まれないうちに Too many packets buffered for output stream で中断する場合、多くはフラグ1つで直せます。原因は muxキュー(多重化キュー)の溢れ です。FFmpegは全出力ストリームの準備が整うまで、先に届いたストリームのパケットをバッファに溜めて待ちます。そのバッファが上限を超えると、処理が中断します。
コンテナはストリーム(映像・音声…)をおおむね時間順に交互配置(インターリーブ)して書き込みますが、muxは全出力ストリームが初期化されて初めて書き出しを開始できます。その間、FFmpegはすでに届いたパケットを muxキュー に保持して待ちます。溜まったデータ量が一定の大きさ(既定ではストリームごとに50 MB、-muxing_queue_data_threshold で設定)を超えると、-max_muxing_queue_size がこのバッファに保持できるパケット数の上限になります。あるストリームの準備が遅れている間に、ほかのストリームのパケットが溜まりすぎると、バッファが上限を超えて溢れ、FFmpegはこのエラーで停止します。
なぜ起きるのか
このエラーは、再エンコード(またはフィルタ処理)するストリームの最初のフレームが遅れる ときに起きます。-c copy でコピーするストリームは開始直後に準備が整いますが、再エンコードするストリームは最初のフレームがエンコーダーに届くまで準備が整いません。たとえば映像が音声より遅れて始まる、フィルタがフレームを溜め込む、といった理由で映像の最初のフレームが遅れると、その間に届いた音声のパケットがmuxキューに溜まり続けます。遅れが十分大きいと、そのバッファが上限を超えて溢れ、処理が失敗します。音声をコピーしていても、再エンコードしていても起きます。一方、全ストリームを -c copy するだけの処理では、開始時点ですべての準備が整うため、ほぼ起きません。
これはファイルの破損ではありません。ストリームごとに準備が整うタイミングがずれるために起きます。
解決策①: muxキューサイズを引き上げる
-max_muxing_queue_size でmuxキューの上限を引き上げます。これは 出力 オプションなので、出力ファイルの前に置きます。コーデックの指定は元のコマンドのままで、キューだけ引き上げます。
ffmpeg -i input.mp4 -max_muxing_queue_size 1024 -c:v libx264 -c:a copy output.mp4
-max_muxing_queue_size 1024— muxキューで最大1024パケットまで待機を許可-c:v libx264 -c:a copy— 映像を再エンコードし、音声はコピーする例(元のコマンドのコーデック指定はそのまま)
キューが大きいほど実行中のメモリは増えますが、遅れたストリームとの差を埋めるだけのパケットを保持できます。まず1024から始め、エラーが続く場合だけ上げてください。
1024でもまだ失敗する場合は、値をさらに上げます。音声も再エンコードする場合も、同じようにキューを引き上げます。
ffmpeg -i input.mp4 -max_muxing_queue_size 4096 -c:v libx264 -c:a aac output.mp4
解決策②: 再エンコードが不要なら全ストリームをコピーする
準備待ちが起きるのは再エンコードするストリームです。コーデックを変える必要がなければ、全ストリームをコピー すると準備待ちそのものがなくなります。コピーするストリームは開始直後に準備が整うためです。
ffmpeg -i input.mp4 -map 0 -c copy output.mp4
-map 0— 入力のストリームをすべて出力に含める(付けないと、映像と音声は1本ずつしか選ばれません)-c copy— 出力するストリームをすべて再エンコードせずにコピー(無劣化・高速)
圧縮や形式変換のために再エンコードが必要な場合は、解決策①の -max_muxing_queue_size でキューを広げてください。
まとめ
| 状況 | 対応 |
|---|---|
| 再エンコード中にエラー | 最初のフレームが遅れたストリームを待つ間に、ほかのストリームのパケットが溢れている |
| 最初の対処 | 出力の前に -max_muxing_queue_size 1024 を追加 |
| 1024でもまだ溢れる | -max_muxing_queue_size 4096 に上げる |
| 再エンコードが不要 | -map 0 -c copy で全ストリームをコピーする |
よくある質問
-max_muxing_queue_size はコマンドのどこに置きますか
出力オプションなので、入力の後・出力ファイルの前に置きます。例: ffmpeg -i input.mp4 -max_muxing_queue_size 1024 -c:v libx264 -c:a copy output.mp4。入力ではなく出力muxのキューを制御します。
キューサイズを大きくすると品質が落ちますか
落ちません。-max_muxing_queue_size は全ストリームの準備が整うまでメモリへ保持できるパケット数を変えるだけで、エンコード品質には影響しません。代わりに、実行中のメモリが少し増えます。
なぜ -c copy だけのときは起きないのですか
コピーするストリームは、開始時点で準備が整うからです。準備待ちが起きるのは、再エンコードするストリームの最初のフレームがエンコーダーに届くまでの間です。音声まで再エンコードしても、映像の最初のフレームが遅れれば同じように溢れます。
最初はどの値から始めればよいですか
1024から始めてください。それでもエラーが続くなら4096に上げます。再エンコードが不要なら、全ストリームを -c copy にする(解決策②)と、このエラーはほぼ起きません。