H264 ビデオ圧縮アルゴリズムは現在、間違いなくすべてのビデオ圧縮技術の中で最も広く使用されています。
最もトレンディな。x264/openh264 や ffmpeg などのオープン ソース ライブラリの導入により、ほとんどのユーザーは H264 の詳細についてあまり調べる必要がなくなり、H264 の使用コストが大幅に削減されます。
ただし、H264 を有効に活用するには、H264 の基本原理を理解する必要があります。今日は、H264 の基本原則を見ていきます。
H264 の概要
H264 圧縮技術は、主に次の方法を使用してビデオ データを圧縮します。含む:
- フレーム内予測圧縮は、空間データの冗長性の問題を解決します。
- フレーム間予測圧縮 (動き推定と補償) は、時間的データの冗長性の問題を解決します。
- 整数離散コサイン変換 (DCT)。空間相関を周波数領域に無関係なデータに変換し、それを量子化します。
- CABAC圧縮。
圧縮されたフレームは、I フレーム、P フレーム、B フレームに分割されます。
- I フレーム: フレーム内圧縮テクノロジーを使用したキー フレーム。
- P フレーム: 前方参照フレーム。圧縮時に、前に処理されたフレームのみを参照します。フレームオーディオ圧縮技術を使用します。
- B フレーム: 双方向参照フレーム。圧縮時に前のフレームとその後ろのフレームを参照します。フレーム間圧縮技術を使用します。
I/P/B フレームに加えて、ピクチャ シーケンス GOP もあります。
GOP: 2 つの I フレームの間に画像シーケンスがあり、画像シーケンス内に I フレームは 1 つだけあります。以下に示すように:
H264 圧縮技術について詳しく説明します。
H264 圧縮テクノロジー
H264 の基本原理は実際には非常に単純です。H264 圧縮データのプロセスを簡単に説明しましょう。カメラによって収集されたビデオ フレーム (1 秒あたり 30 フレームで計算) は、H264 エンコーダのバッファに送信されます。エンコーダはまずピクチャごとにマクロブロックを分割します。
例として次の写真を見てみましょう。
マクロブロックを分割する
デフォルトでは、H264 は 16X16 サイズの領域をマクロブロックとして使用します。これは 8X8 サイズに分割することもできます。
マクロブロックを分割した後、マクロブロックの画素値を計算する。
同様に、画像内の各マクロブロックのピクセル値が計算され、すべてのマクロブロックが次のように処理されます。
サブブロック
H264 は、比較的平坦な画像に 16X16 マクロブロックを使用します。ただし、圧縮率を高めるために、16X16 マクロブロックをさらに小さなサブブロックに分割することができます。サブブロックのサイズは 8X16、16X8、8X8、4X8、8X4、4X4 であり、非常に柔軟です。
上の図では、赤枠内の 16X16 マクロブロックの大部分は青色の背景を持ち、3 羽のワシの一部の画像がマクロブロック内に描画されています。3 羽のワシの部分画像をより適切に処理するために、H264 は 16X16 内でマクロブロックは複数のサブブロックに分割されます。
このようにして、フレーム内圧縮後、より効率的なデータを取得できます。以下の図は、上記のマクロブロックをそれぞれ mpeg-2 と H264 を使用して圧縮した結果です。左半分がMPEG-2のサブブロック分割後の圧縮結果、右半分がH264のサブブロック分割後の圧縮結果であり、H264の分割方法の方が有利であることがわかる。
マクロブロックが分割された後、H264 エンコーダのキャッシュ内のすべてのピクチャをグループ化できます。
フレームのグループ化
映像データのデータ冗長性には主に 2 種類あり、1 つは時間的なデータ冗長性、もう 1 つは空間的なデータ冗長性です。その中で、時間的なデータの冗長性が最も大きくなります。次に、ビデオデータ時間の冗長性の問題について説明します。
なぜ時間の冗長性が最も大きいと言われるのでしょうか? カメラが 1 秒あたり 30 フレームをキャプチャすると仮定すると、ほとんどの場合、これら 30 フレームのデータは相関します。30 フレームを超えるデータが存在することもあり、おそらく数十フレーム、または数百フレームのデータがすべて密接に関連しています。
これらの密接に関連したフレームについては、実際には 1 つのフレームのデータを保存するだけでよく、他のフレームはこのフレームを通じて一定の規則に従って予測できるため、ビデオ データは時間的に最も冗長性があります。
関連するフレームを予測してデータを圧縮するには、ビデオ フレームをグループ化する必要があります。では、いくつかのフレームが密接に関連しており、グループとして分類できることをどのように判断するのでしょうか? 例を見てみましょう。以下は、移動するビリヤード ボールをキャプチャした一連のビデオ フレームです。ビリヤード ボールは、右上隅から左下隅まで転がります。
H264 エンコーダは、マクロブロック比較のために隣接する 2 つのフレームを順番に取り出し、2 つのフレーム間の類似性を計算します。以下に示すように:
マクロブロック スキャンとマクロブロック検索を通じて、これら 2 つのフレーム間の相関が非常に高いことがわかります。さらに、このフレーム群の相関度は非常に高いことが分かる。したがって、上記のフレームは 1 つのグループに分けることができます。アルゴリズムは次のとおりです:いくつかの隣接する画像フレームでは、通常、ピクセルの 10% 以内の差を持つ点のみが存在し、輝度の差の変化は 2% を超えませんが、色の差の変化はわずか 1% 以内です。このようなグラフはグループにグループ化できると考えてください。
このようなフレーム群では、エンコード後は最初のフレームの完全なデータのみが保持され、他のフレームは前のフレームを参照して計算されます。最初のフレームをIDR/I フレームと呼び、その他のフレームをP/B フレームと呼び、符号化されたデータ フレーム グループをGOPと呼びます。
動きの推定と補償
H264 エンコーダでフレームがグループ化された後、フレーム グループ内のオブジェクトの動きベクトルを計算する必要があります。また、上記の動いているビリヤード ビデオ フレームを例として、動きベクトルがどのように計算されるかを見てみましょう。
H264 エンコーダは、まずバッファの先頭から 2 フレームのビデオ データを順番に取得し、その後マクロブロック スキャンを実行します。一方の画像でオブジェクトが見つかると、もう一方の画像の近傍 (検索ウィンドウ内) で検索が実行されます。このとき、別の画像内に物体があれば、その物体の動きベクトルを計算することができる。下の写真は検索後のビリヤードボールの位置です。
Douyin----「ビデオ 1M 9M
テーブルマップの方向と距離は、上の写真のビリヤードのボールの位置の違いから計算できます。H264 は、各フレームでボールが移動した距離と方向を順番に記録し、次のようになります。
動きベクトルが計算されたら、同じ部分 (つまり、緑色の部分) を減算して補償データを取得します。最終的には、補正データを圧縮して保存するだけでよく、後でデコードするときに元の画像を復元できます。圧縮・補正されたデータは、少量のデータを記録するだけで済みます。次のように:
ビデオ フレームの時間的なデータの冗長性を解決する、動きベクトルと補償フレーム間圧縮技術を「フレーム間圧縮技術」と呼びます。フレーム間圧縮に加えて、フレーム内データ圧縮も必要であり、フレーム内データ圧縮により空間上のデータの冗長性が解決されます。次にフレーム内圧縮技術を紹介します。
イントラ予測
人間の目は画像をある程度認識でき、低周波の明るさには非常に敏感ですが、高周波の明るさにはあまり敏感ではありません。したがって、いくつかの研究に基づいて、画像内の人間の目に影響を与えないデータを削除することができます。このようにして、イントラ予測技術が提案される。
H264 のフレーム内圧縮は JPEG と非常に似ています。画像がマクロブロックに分割された後、マクロブロックごとに 9 つの予測モードを実行できます。元の画像に最も近い予測モデルを見つけます。
下の図は、ピクチャ全体の各マクロブロックを予測するプロセスです。
イントラ予測画像と元の画像の比較は次のとおりです。
そして、原画像とイントラ予測画像とを減算して残差値を求める。
次に、デコード時に元の画像を復元できるように、前に取得した予測モード情報を保存します。効果は次のとおりです。
フレーム内およびフレーム間圧縮後、データは大幅に削減されましたが、まだ最適化の余地があります。
残差データに対して DCT を実行する
整数離散コサイン変換を残差データに対して実行して、データの相関を除去し、データをさらに圧縮することができます。下の図に示すように、左側は元のデータのマクロブロック、右側は計算された残差データのマクロブロックです。
残差データ マクロブロックがデジタル化されると、次の図に示されます。
残差データマクロブロックはDCT変換される。
関連するデータを削除すると、データがさらに圧縮されていることがわかります。
DCT が完了した後は十分ではなく、可逆圧縮には CABAC が必要です。
DCT の原理をわかりやすく説明する
最初のフレームは次のとおりです: P1 (参照フレーム)
これは 2 番目のフレームです: P2 (エンコードする必要があるフレーム)
ビデオから 1 ~ 2 秒間隔で切り取られた 2 枚の写真は、実際の状況に似ています。いくつかのモーション検索を実行してみましょう。
これはデモ プログラムです。P2 上の任意の16x16ブロックをマウスで選択すると、 P1 上のBestMatchマクロ ブロックを検索できます。車両が遠くから近くに移動しているにもかかわらず、最も近いマクロブロック座標は依然として見つかります。
これはデモ プログラムであり、P2 上の任意の 16x16 ブロックをマウスで選択し、P1 上の BestMatch マクロ ブロックを検索します。車両が遠くから近くに移動しているにもかかわらず、最も近いマクロブロック座標は依然として見つかります。
探索デモ2:架空線横断位置(上P1、下P2)
また、P1 内の P2 のポスターに最も近いマクロブロック位置を見つけることに成功しました。
フル画像検索: P1 と動きベクトル データに基づいて復元された P2' (P1 の各マクロブロックの最も類似した位置セットを P2 で検索)、つまり、P1 ピクチャの各位置のマクロブロックから P2 に最も類似したものをつなぎ合わせます。 P2' の効果は次のとおりです。
よく見ると、少し断片化していますよね?間違いなく、これが私たちがまとめたものです。ここで、P2` と P2 ピクセルを減算して、差分画像 D2 = (P2' - P2) / 2 + 0x80 を取得します。
これは、エラー D2 を追加した後、以前に断片化された P2' がどのようにして明確に見えるようになり、基本的に元のピクチャ P2 を復元する方法です。
D2 は 5KB しか占有せず、圧縮された動きベクトルはわずか 7KB であるため、P1 を参照して P2 を完全に表現するには追加の 7KB のデータだけが必要です。また、P2 が許容可能な品質の非可逆圧縮方式で個別に圧縮されている場合、少なくとも50 ~ 60KB になり、ほぼ 8 倍のスペースが節約されます。これが、いわゆるモーション コーディングの基本原理です。
実際の使用では、参照フレームは必ずしも前のフレームである必要はなく、同じ GOP の I フレームである必要もありません。GOP 間隔が長い場合、後続のピクチャが I フレームから大きく変化している可能性があるため、一般的には最後の 15 フレームの中で最も誤差が小さいフレームが参照フレームとして選択されます カラー画像には 3 つの YUV コンポーネントがありますが、多くの予測作業と最適な選択は通常、Y コンポーネントのグレースケール フレームに基づいて判断されます。
なお、保存する誤差は(P2-P2')/2 + 0x80ですが、実際に使用する場合は[-64,64]間の色差精度を1,[-255]にするなど、より効率的な方法を使用します。 , [-64]、[64、255]の色差精度は2~3となり、よりリアルになります。
同時に、上記の多くの場所では、単純なストレージに直接 lzma2 が使用されていますが、実際の使用では、一般的にエントロピーコーディングが導入され、データが一定のレベルでソートされてから圧縮されるため、パフォーマンスが大幅に向上します。
カバック
上記のフレーム内圧縮は非可逆圧縮技術です。つまり、圧縮された画像は完全に復元することはできません。CABAC は可逆圧縮技術です。
誰もが最もよく知っている可逆圧縮技術は、データ圧縮の目的を達成するために高頻度の単語に短いコードを与え、低頻度の単語に長いコードを与えるハフマン符号化かもしれません。MPEG-2で使われているVLCもそのようなアルゴリズムで、AZを例にとると、Aは高周波データ、Zは低周波データに属します。それがどのように行われるかを見てください。
CABAC は、高周波データ用のショート コードと低周波データ用のロング コードも提供します。同時に、コンテキストの依存関係に従って圧縮も行うため、VLC よりもはるかに効率的です。効果は次のとおりです。
AZ をビデオ フレームに置き換えると、以下のようになります。
上の図から、CACBA を使用した可逆圧縮スキームが VLC よりもはるかに効率的であることは明らかです。