再エンコードせずに、h.264 ストリームをどこでもカットすることは可能ですか?

再エンコードせずに、h.264 ストリームをどこでもカットすることは可能ですか?

注: 当初は誤って 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
  1. select='eq(pict_type,PICT_TYPE_I)': Iフレーム画像を抽出します
  2. vsync: ビデオ同期方法。
  3. vfr: 可変フレームレート。

関連情報