1. ホーム
  2. ffmpeg

[解決済み] Past duration X.XXX too large』とはどういう意味ですか?

2022-05-07 20:05:38

質問

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で1秒単位までしか計測していません。そこで、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つだけ発生)されるようになりました。 つまり、2回目の起動がうまくいっても、3回目の起動がうまくいかないことがあるのです。 私の当面の目的では、2番目の起動に落ち着くつもりで、それがこれらの問題のほとんどを解決してくれることを願っています。

これはすべてffmpegのバージョン4.0での話です。