DASHのFFmpegでキーフレームを修正する正しい方法は何ですか?
ストリームをDASH再生用に調整する場合、ランダムアクセスポイントはすべてのストリームでまったく同じソースストリーム時間でなければなりません。これを行う通常の方法は、固定フレームレートと固定GOP長(つまり、Nフレームごとのキーフレーム)を強制することです。 FFmpegでは、固定フレームレートは簡単です(-r NUMBER)。 しかし、固定キーフレームの場所(GOPの長さ)には、3つの方法があります...どれが「正しい」ですか?FFmpegのドキュメントは、これについてイライラするほどあいまいです。 方法1:libx264の引数をいじる -c:v libx264 -x264opts keyint=GOPSIZE:min-keyint=GOPSIZE:scenecut=-1 シーンカットが発生したときにキーフレームの「カウンター」が再起動されるかどうかは不明であるため、シーンカットをオフにするかどうかについては、いくつかの議論があるようです。 方法2:固定GOPサイズを設定する: -g GOP_LEN_IN_FRAMES 残念ながら、これはFFMPEGのドキュメントを渡すことでのみ文書化されているため、この引数の効果は非常に不明確です。 方法3:N秒ごとにキーフレームを挿入する(たぶん?): -force_key_frames expr:gte(t,n_forced*GOP_LEN_IN_SECONDS) これは明示的に文書化されています。ただし、キーフレームごとに「タイムカウンタ」が再起動するかどうかはまだ明確ではありません。たとえば、予想される5秒のGOPで、scenecutlibx264によって3秒注入されたキーフレームがある場合、次のキーフレームは5秒後ですか、それとも2秒後ですか? 実際、FFmpegのドキュメントではこれと-gオプションを区別していますが、上記の2つのオプションがどのように異なるかについては実際には言及していません(明らかに、-g固定フレームレートが必要になります)。 どちらが正しいですか? -force_key_frames固定フレームレートを必要としないため、の方が優れていると思われます。ただし、これには以下が必要です。 H.264のGOP仕様に準拠しています(ある場合) libx264 scenecutキーフレームに関係なく、固定リズムでキーフレームが存在することを保証します。 また-g-rffmpeg、異なるコーデック引数での複数の実行が各解像度で同じ瞬間フレームレートを提供するという保証がないため、固定フレームレート()を強制しないと機能しなかったように思われます。フレームレートを固定すると、圧縮パフォーマンスが低下する場合があります(DASHシナリオでは重要です!)。 最後に、keyintメソッドはハックのように見えます。これが正しい答えではないという希望に反して願っています。 参照: -force_key_framesメソッドを使用した例 keyintメソッドを使用した例 FFmpegの高度なビデオオプションセクション