ffmpegを使用してH.264をエンコードすると、次のタイプの警告がまとめて表示されます。
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
彼らはどういう意味ですか?オンラインでも、ffmpegのドキュメントでも明確なものは見つかりませんでした。
ffmpegを使用してH.264をエンコードすると、次のタイプの警告がまとめて表示されます。
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
彼らはどういう意味ですか?オンラインでも、ffmpegのドキュメントでも明確なものは見つかりませんでした。
回答:
特定のエンコードでこれらの警告が何千回も表示されました。1080pビデオを480pにダウンスケーリングしていました。編集ポイントで、ソースレーザーディスクの欠陥が原因で問題のあるビデオがあった場合、これらのメッセージが表示され始め、その後、すべてのフレームで表示されたと思います。彼らは次の短い抜粋のように何度も続けました:
Past duration 0.901115 too large= 535031kB time=00:54:15.06 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 31 times
Past duration 0.901115 too large= 535031kB time=00:54:15.62 bitrate=1346.3kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 34 times
Past duration 0.901115 too large= 535031kB time=00:54:16.21 bitrate=1346.0kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 36 times
Past duration 0.901115 too large= 535338kB time=00:54:16.83 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 39 times
元のffmpegの呼び出しは次のとおりです。
ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv
ここでの提案に従って、最初に-framerate 60000/1001を入力に追加しました。それは何も改善しませんでした。-framerateを保持し、出力に-r 60000/1001を追加しました。それでもまだ何も改善されませんでした。両方を保持して、最終的に-async 1 -vsync 1を追加しました。これにより、単一の警告が表示されましたが、それだけです。その呼び出しは:
ffmpeg -i input.mp4 -framerate 60000/1001 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -r 60000/1001 -async 1 -vsync 1
MediaInfoからの詳細なダンプで私が見つけた唯一の違いは、最初の呼び出しで見つかったこの行の削除でしたが、2番目の呼び出しでは見つかりませんでした。
Delay relative to video : -33ms
ただし、A / V同期をファイルの最初と最後の近くで確認したところ、2つのファイルの同期に識別可能な違いはありませんでした。彼らの実行時間も同じでしたが、それはVLCで最も近い秒にのみ測定されました。そこで、ffmpegを使用してフレーム数を確認しました。
ffmpeg -i output.mkv -map 0:v:0 -c copy -f null -
そして、出力の終わり近くで "frame =#"を探します。
ソースビデオの長さは375226フレームで、元の呼び出しでは375195フレーム、2番目の呼び出しでは375200でした。したがって、警告メッセージが非常に少ない2番目の呼び出しでも、フレームが5つ少なくなりました。
その後のテストでは、-framerateと-rは不要であり、2つの同期フラグを使用するだけで十分であることがわかりました。これにより、上記の2番目の呼び出しと同じ結果が生成されたため、問題を解決するために3番目に簡単な呼び出しは次のとおりです。
ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -async 1 -vsync 1
さらに、別のファイルでは、同期フラグを使用してもこれらの警告が大量に生成されましたが、レートフラグを追加すると「修正」されました(数千の警告ではなく2つしか警告が生成されませんでした)。したがって、3番目の呼び出しが機能しない場合でも、2番目の呼び出しが機能することがあります。私の当面の目的のために、2番目の呼び出しで解決し、これらの問題のほとんどが修正されることを願っています。
これはすべてffmpegバージョン4.0でのことでした。
-async 1 -vsync 1
、私のために修正しました。
SourceForgeのDVDStylerプロジェクトのメンテナの1人がこれについて次のように述べています:
2015年1月15日以降のFFMpegバージョンでは、この警告が頻繁に表示されます。レートコントロールの歪みの可能性について警告するために追加されています。それ以外の場合は害はありません。
この警告メッセージは、高フレームレートのソースを低フレームレートの出力にエンコードしようとしたときに表示されます。つまり、フレームをドロップする必要があります。
一連の画像をビデオに変換したかったため、このエラーが発生しました。
ffmpeg -i %05d.png -r 24 -c:v libx264 -crf 5 out.mkv
問題は、入力にフレームレートが指定されていない場合、25 fpsのフレームレートが想定されることです。
Input #0, image2, from 'frames/%04d.bmp':
Duration: 00:00:15.96, start: 0.000000, bitrate: N/A
Stream #0:0: Video: bmp, bgra, 920x650, 25 fps, 25 tbr, 25 tbn, 25 tbc
これは、エンコードされたフレームの総数でも確認できます。画像は400枚ありましたが、上記のコマンドは384のみをエンコードしました。
frame= 384 fps= 68 q=-1.0 Lsize= 10931kB time=00:00:15.91 bitrate=5626.1kbits/s dup=0 drop=15
video:10928kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.033807%
エラーメッセージは、出力フレームレートの場合、代わりに入力フレームレートを設定することで消えます。次に、出力フレームレートは、入力のフレームレートになるように自動的に選択されます。さらに、新しいffmpegバージョンでは注意する必要があり-i
ます。オプションまたはimage2
or v4l2
入力形式でPNG画像を使用する場合-framerate
は-r
、の代わりにを使用する必要があるため、-r
オプションのドキュメントを参照してください。
ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv
入力と出力の両方のフレームレートを個別に指定することもできます。
ffmpeg -framerate 25 -i %05d.png -r 10 -c:v libx264 -crf 5 out.mkv
この場合、161/400フレームのみがエンコードされます。暫定的に他のフレームはドロップされます。また、エラーメッセージが消えます。stdoutへのスパム送信によってffmpegの速度が低下しないようにするためです。
-r
ても機能し-framerate
なかった場所を使用しました。
ffmpeg -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
までこれ以上警告なしに開始しました(入力用ffmpeg -framerate 50 -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
に-framerate 50
追加されたことに注意してください)
ソースコードを見ると、入力ストリームの表示時間(pts)と出力ストリームの表示時間の差は、0.6に設定された固定制限を超えていることがわかります。
ソースからの抜粋:
delta0 = sync_ipts - ost->sync_opts;
delta = delta0 + duration;
...
if (delta0 < 0 &&
delta > 0 &&
format_video_sync != VSYNC_PASSTHROUGH &&
format_video_sync != VSYNC_DROP) {
double cor = FFMIN(-delta0, duration);
if (delta0 < -0.6) {
av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
} else
av_log(NULL, AV_LOG_DEBUG, "Cliping frame in rate conversion by %f\n", -delta0);
sync_ipts += cor;
duration -= cor;
delta0 += cor;
}
これは一目でわかるので、深く掘り下げてください。
format_video_sync = VSYNC_DROP
たりformat_video_sync = VSYNC_PASSTHROUGH
、ユースケースでそれらの1つが実行可能かどうかを確認したりできます。
-r
スイッチを使用して明示的にフレームレートを設定すると、これらの警告が「修正」されたことがわかりました。
あたりとしてFFmpegの発行#4700 -過去の期間0.999992大きすぎる 、それは単なる警告です。使用する:
ffmpeg -loglevel -quiet -i input_file.xyz ....
それを止める。
ネッド