Twitchにはこれに関する投稿があります。彼らは、いくつかの理由で独自のプログラムを使用することに決めたと説明しています。その1つは、ffmpegでは、異なるスレッドで異なるx264インスタンスを実行できないが、代わりに、指定されたすべてのスレッドを1つの出力の1つのフレームに割り当ててから次の出力に進むというものでした。
リアルタイムストリーミングを行っていない場合は、さらに贅沢を味わえます。「正しい」方法は、おそらく-gで指定されたGOPサイズだけで1つの解像度でエンコードし、その後、同じ場所でキーフレームを強制する他の解像度でエンコードすることです。
これを行うには、ffprobeを使用してキーフレーム時間を取得し、シェルスクリプトまたは実際のプログラミング言語を使用してそれをffmpegコマンドに変換します。
ただし、ほとんどのコンテンツでは、5秒ごとに1つのキーフレームと5秒ごとに2つのキーフレーム(強制的に1つとシーンカットから1つ)を使用してもほとんど違いはありません。これは、PフレームとBフレームのサイズに対するIフレームの平均サイズです。通常の設定でx264を使用する場合(これらに影響を与えるために何かを行う必要があると思う唯一の理由は、簡単なコンテンツでx264がビットレートを使用できないようにする-qminを設定する場合です。 、私は思う)、46 kBのIフレーム平均サイズ、Pフレーム24 kB、Bフレーム17 kB(Pフレームの半分の頻度)、30 fpsで毎秒余分なIフレームのような結果を得るファイルサイズが3%増加するだけです。h264とh263の違いは、3%の減少で構成されている可能性がありますが、1つの違いはそれほど重要ではありません。
他の種類のコンテンツでは、フレームサイズが異なります。公平を期すために、これは空間的な複雑さではなく時間的な複雑さに関するものであるため、単純なコンテンツとハードなコンテンツではありません。ただし、一般的に、ストリーミングビデオサイトにはビットレートの制限があり、比較的大きなIフレームを持つコンテンツは、追加のキーフレームがいくつ追加されても高品質でエンコードされる簡単なコンテンツです。それは無駄ですが、この無駄は通常は気づかれません。最も無駄なケースはおそらく、各キーフレームがまったく同じである、歌に付随する単なる静止画像のビデオです。
私が確信していないことの1つは、-maxrateおよび-bufsizeで設定されたレートリミッターと強制キーフレームがどのように相互作用するかです。YouTubeでさえ、バッファ設定を正しく構成して一貫した品質を提供する最近の問題があったと思います。一部のサイトで見られるような平均ビットレート設定を使用している場合(ヘッダー/ movアトムのx264のオプションを16進エディターで検査できるため)、バッファーモデルは問題ではありませんが、ユーザーが生成したコンテンツを配信する場合、平均ビットレートにより、ユーザーはビデオの最後に黒い画面を追加するようになります。
Ffmpegの-gオプション、または使用するその他のエンコーダオプションは、エンコーダ固有のオプションにマップされます。したがって、「-x264-params keyint = GOPSIZE」は「-g GOPSIZE」と同等です。
シーン検出の使用に関する1つの問題は、何らかの理由で特定の数値に近いキーフレームを好む場合です。5秒ごとにキーフレームを指定してシーン検出を使用し、4.5でシーンが変化した場合、検出されるはずですが、次のキーフレームは9.5になります。時間がこのようにステップアップし続けると、40、45、50、55の代わりに42.5、47.5、52.5などのキーフレームになってしまう可能性があります。逆に、5.5でシーンが変更されると、 5と5.5のキーフレームは、他のキーフレームには早すぎます。Ffmpegでは、「次の30フレーム内にシーンの変更がない場合、ここにキーフレームを作成する」ことを指定できません。ただし、Cを理解している人はそのオプションを追加できます。
可変フレームレートビデオの場合、Twitchのようなライブストリーミングではない場合、恒久的なフレームレートに永続的に変換することなくシーンの変更を使用できるはずです。ffmpegで「select」フィルターを使用し、式で「scene」定数を使用すると、デバッグ出力(-v debugまたはエンコード中に「+」を数回押す)にシーン変更番号が表示されます。これはおそらく、x264で使用されている数値とは異なり、それほど有用ではありませんが、それでも有用な場合があります。
したがって、手順はおそらく、キーフレームの変更のみを目的としたテストビデオを実行することですが、2パスを使用している場合はレート制御データに使用できます。(生成されたデータがさまざまな解像度と設定に役立つかどうかはわかりません。マクロブロックツリーデータは役に立ちません。)一定フレームレートのビデオに変換しますが、このバグを参照あなたが判断した場合、フレームレートを半分にすると出力を吃音についてfpsフィルターを他の目的に使用するには。希望するキーフレームとGOP設定でx264を介して実行します。
次に、これらのキーフレーム時間を元の可変フレームレートビデオで使用します。
フレーム間に20秒のギャップがある完全にクレイジーなユーザー生成コンテンツを許可する場合、可変フレームレートエンコードの場合、出力を分割し、fpsフィルターを使用し、何らかの方法でselectフィルターを使用できます(おそらく、すべてのキーフレーム時間)...またはテストビデオを入力として使用し、そのffmpegオプションが機能する場合はキーフレームのみをデコードするか、選択フィルターを使用してキーフレームを選択することができます。次に、正しいサイズにスケーリングし(このためのscale2refフィルターもあります)、元のビデオをオーバーレイします。次に、インターリーブフィルターを使用して、これらの強制キーフレームを元のビデオと組み合わせます。これにより、インターリーブフィルターが妨げない2つのフレームが0.001秒離れている場合は、別の選択フィルターを使用してこの問題を自分で解決してください。ここでは、インターリーブフィルターのフレームバッファー制限に対処することが主な問題になる可能性があります。これらはすべて動作する可能性があります。何らかの種類のフィルターを使用して、より高密度のストリームをバッファーに入れます(FIFOフィルター?)。入力ファイルを複数回参照するため、複数回デコードされ、フレームを保存する必要はありません。「streamselect」フィルターを使用します。これは、キーフレームの正確なタイミングで、これまで行ったことのないものです。デフォルトの動作を変更するか、フレームをドロップする代わりにバッファの最も古いフレームを出力するオプションを追加することにより、インターリーブフィルターを改善します。キーフレームの正確なタイミングで、私は一度もやったことがありません。デフォルトの動作を変更するか、フレームをドロップする代わりにバッファ内の最も古いフレームを出力するオプションを追加して、インターリーブフィルターを改善します。キーフレームの正確なタイミングで、私は一度もやったことがありません。デフォルトの動作を変更するか、フレームをドロップする代わりにバッファ内の最も古いフレームを出力するオプションを追加して、インターリーブフィルターを改善します。