「過去の期間X.XXXが大きすぎる」とはどういう意味ですか?


142

ffmpegを使用してH.264をエンコードすると、次のタイプの警告がまとめて表示されます。

Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large

彼らはどういう意味ですか?オンラインでも、ffmpegのドキュメントでも明確なものは見つかりませんでした。


2
ffmpegに関する質問は、video.stackexchange.comベータ版に送信してください。ffmpegタグの説明を参照してください。
OndraŽižka2016年

34
@Ondra別のスタック交換?私はそれらの100以上のサブサイトと混同していますが、それがstackexchangeが向かっている肯定的な方向であるかどうかはわかりません。
mxmlnkn 2017

1
@mxmlnkn同意します、それはあなたをより単純な時間に長くします... :)
Erik

4
それはそうですね。StackOverflowはプログラミング用であり、プログラミングではありません。ビデオ処理に関するQ&Aサイトがありますが、これはビデオ処理に関する質問です。理解してはいけないことは何ですか?
OndraŽižka2017年

タグの説明も読んでください。
OndraŽižka2017年

回答:


23

特定のエンコードでこれらの警告が何千回も表示されました。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でのことでした。


2
これありがとう!何日か問題が発生した後-async 1 -vsync 1、私のために修正しました。
Offek

1
この分析に感謝@larryyは非常に役に立ちました
deepelement

90

SourceForgeのDVDStylerプロジェクトのメンテナの1人がこれについて次のように述べいます:

2015年1月15日以降のFFMpegバージョンでは、この警告が頻繁に表示されます。レートコントロールの歪みの可能性について警告するために追加されています。それ以外の場合は害はありません。


「レート制御歪みは」に関連している(主映像)をコード入力のタイムスタンプと比較してあまりにも多くの出力タイムスタンプ異なるかどうかについてですこの警告への関係を、(比較的)がありません
ギャン

最初の数回は警告を受け取りましたが、変換を終了しましたが、このアドバイスにより実行を許可し、しばらくすると警告が停止し、変換は正常に完了しました。ありがとう。
IRTFM

58

この警告メッセージは、高フレームレートのソースを低フレームレートの出力にエンコードしようとしたときに表示されます。つまり、フレームをドロップする必要があります。


一連の画像をビデオに変換したかったため、このエラーが発生しました。

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ます。オプションまたはimage2or 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の速度が低下しないようにするためです。


3
「-iオプションでPNG画像を使用する場合のみ、-rの代わりに-framerateを使用する必要があるため」-これにより、私の問題は完全に解決されました。ありがとう!
匿名

1
wmvをmp4に変換しようとする際に、使用し-rても機能し-framerateなかった場所を使用しました。
1934286

+1と私はあなたの「要約」を一番上に移動することをお勧めします。さらに、画像をビデオに変換し、出力フレームレートを上げて出力を高速化しようとする私のケースを解決したので。私はこれからこれ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追加されたことに注意してください)
el-teedee

49

ソースコードを見ると、入力ストリームの表示時間(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;
    }

これは一目でわかるので、深く掘り下げてください。


この問題を「修正」するため、または出力ポイントを明示的に設定するためにできることはありますか?
Baodad 2017

1
私はこの問題を取り巻く詳細を覚えていませんが、「修正」によって警告を取り除くことを意味する場合は、上記のコードに基づいてオプションを調べformat_video_sync = VSYNC_DROPたりformat_video_sync = VSYNC_PASSTHROUGH、ユースケースでそれらの1つが実行可能かどうかを確認したりできます。
エリック

ありがとう。-rスイッチを使用して明示的にフレームレートを設定すると、これらの警告が「修正」されたことがわかりました。
Baodad 2017年

1
個人的な経験からのほんの一部です。「過去の期間」のメッセージスパムの問題があり、-r 25で入力フレームレートを強制することで修正しましたが、オーディオが大幅に同期しなくなりました。-rオプションを削除し、「-async 1 -vsync 1」を使用してオーディオの非同期を防止することで、オーディオの問題を防止できましたが、「過去の期間」のスパムもなくなったようです。
Jason Lang、

v 4.1以降では、ログレベルがアップグレードされているため、デフォルトのログレベルでは表示されません。
Gyan


1

コマンドは実際には次のようになります。

ffmpeg -loglevel quiet -i input_file.xyz ...

これはオプションではなく、「-loglevel」オプションの値であるため、「quiet」パラメーターの「-」接頭辞はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.