注: 当初は誤って h.264 ストリームを MP4 ファイルという一般的な用語で呼んでいました。申し訳ありません。
結果のビデオがキーフレームで始まるように、通常はキーフレームで h.264 を分割する必要があることは承知していますが、ストリーム構造/仕様の何がそうさせるのか疑問に思っています。
キーフレームは、ファイル全体の固定パラメータとして X フレームごとに発生する必要がありますか、それともキーフレーム間の間隔は可変ですか? プレーヤーがフレームを出現時に取得し、全体を描画する (キーフレーム) か、一部を更新する (非キーフレーム) だけの場合、キーフレーム間隔が問題になるのはなぜですか?
間隔は問題ではなく、100 フレームごとにキーフレームがあるストリームのフレーム 87 でカットしたい場合、86 のプリアンブル フレームを使用して新しいファイルの新しいキーフレームを計算し、元のファイルから残りの 12 の非キー フレームを配置して次のキーフレームに移動し、次に次の元のキーフレーム (フレーム 100) に移動して、そこから進むことはできないでしょうか。
つまり、ファイルの最後は「新しいキー、12 個の元の非キー、元のキー、99 個の元の非キー、元のキー...」になります。
答え1
キーフレームはいつでも発生する可能性があります。引用元は見つかりませんが、カットシーンの多い映画を想像してみてください。ビデオの品質を維持するために、キーフレームを劇的なシーン変更後の最初のフレームにする必要があります。そうしないと、ビデオ コンプレッサーが前のシーンからの多くの「デルタ」変更を使用して新しいシーンを作成しようとするため、ノイズの嵐になってしまいます。
通常のストリームでは、キーフレームのタイミングが一定であっても問題ありませんが、エンドコンテンツでは、シーン変更の境界にキーフレームを配置することで、より良い品質が実現されます。
キーフレーム(iフレーム)は、ビデオ内の画像のフルフレームです。後続のフレーム、つまりデルタフレームには、変更された情報のみが含まれます。キーフレームはストリーム内で複数回表示されます。作成方法やストリーミング方法によって異なります。
確かにそうだ調整可能で、品質とビットレートの要件によって異なります。
のmp4のデフォルトは250フレームごとにキーフレームです(つまり、約 10 秒ごと)。解像度を変更するのが難しくなるため、ストリーミングには適していません。Youtubeは2秒のキーフレーム間隔を使用します。
iframe(キーフレーム)のみを抽出する方法もいくつかあります。BogoToBogo: サムネイル (IFRAME / シーン変更) - 2020
iフレームサムネイル
次のコマンドは、Iフレームごとにyi01.png、yi02.jpg、yi03.png...yi116という名前のサムネイル画像を1つ作成します。
ffmpeg -i yosemiteA.mp4 -f image2 -vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr yi%03d.png
select='eq(pict_type,PICT_TYPE_I)'
: Iフレーム画像を抽出しますvsync
: ビデオ同期方法。vfr
: 可変フレームレート。