web-dev-qa-db-ja.com

FFmpegが60 fpsのGIF画像に対して16ミリ秒ではなく10 + 20 + 20ミリ秒を選択するのはなぜですか?

60 fpsの短いビデオをGIFファイルに変換したいのですが。走る

ffmpeg -i foo.flv foo.gif

gIFファイルを生成します。すごい!

唯一の問題は、生成されたGIFビデオのモーションがぎくしゃくして不均一であることです。別のツールを使用すると、FFmpegが最初のフレームが10ミリ秒、2番目のフレームが20ミリ秒、3番目のフレームが20ミリ秒の動画を作成し、その後は10ミリ秒、20ミリ秒、20ミリ秒のように繰り返されることがわかります。別のツールを使用して、フレームごとに(フレームのコンテンツを変更せずに)均一に16ミリ秒に調整すると、結果は美しく見えます。

なぜFFmpegはこれをしているのですか?代わりにフレームごとに16ミリ秒を要求するGIFファイルを書き込むように依頼して、2番目のツールを使用する必要がないようにするにはどうすればよいですか?

これを確認しました 関連する質問 60 fpsのGIFビデオが存在するかどうかを尋ねていますが、FFmpegに動作を変更するように依頼する方法についての質問には対応していません。さらに、それは新しい質問を提起します:16msがGIFが表現できる時間ではない場合、私が使用している他のツールは何ですか?なぜそれがうまく機能するのですか?

67
Daniel Wagner

60 FPS GIFが実際に存在しますか?それとも最大50 FPSですか? で説明したように、GIFのフレーム時間の解像度は10msなので、フレームあたり16msのナイスでさえ不可能です。したがって、質問に対する回答は、順番に次のとおりです。

なぜffmpegはこれをしているのですか?

10 + 20 + 20は平均60fpsであり、GIF形式の制約内で表すことができるそのプロパティを使用した最も正確な近似であるためです。

代わりにフレームあたり16ミリ秒を要求するgifを作成するように依頼して、2番目のツールを使用する必要がないようにするにはどうすればよいですか?

Gif形式ではそれを表現できないため、それはできません。しかし、50fpsビデオを作成するように要求すると、canGIF形式で正確に表現できるため、スムーズな結果が得られることがわかりました。これは次のようにして行うことができます:

ffmpeg -i foo.flv -vf fps=50 foo.gif

これは、最近傍の時間補間を使用して、出力に転送するフレームを選択します。

16msがgifで表現できる時間ではない場合、私が使用している他のツールは何ですか?なぜそれがうまく機能するのですか?

私が使用していたもう1つのツールはGIMPで、各フレームを最も近い表現可能なサイズに丸めることを選択したため、要求された16ミリ秒/フレームを20ミリ秒/フレームに静かに変更していました。私の貧しい人間の目は、すべてがわずかに遅すぎて正しいとは言えないことを理解できないので、おそらくうまくいきます。異常な間隔でではなく、その動きだけがスムーズに起こっていました。

82
Daniel Wagner