魔法の H.264 アルゴリズム

非常に目を見張るような記事: https://sidbala.com/h-264-is-magic/

この記事はその翻訳であり、一語一句翻訳するのではなく、興味深い部分または重要な部分のみを選択します。

H.264 は、ビデオの送信に必要な帯域幅を削減するという 1 つの目標を持つビデオ圧縮コーデック規格です。インターネットビデオ、ブルーレイビデオ、携帯電話、ドローンなど、すべてH.264を使用しており、どこにでもあると言えます。

なぜ圧縮が必要なのか

ビデオはフレームで構成されており、フレームは実際には画像であり、画像は実際には 3 次元のマトリックスです (opencv2 を使用して画像を読み取り、印刷してその構造を知ることができます)。

圧縮されていない場合の 60fps ビデオの 1 秒あたりのサイズは次のとおりです。つまり、50GB の Blu-ray ディスクは約 2 分間のビデオしか保存できず、ほとんど管理できません。

したがって、圧縮が必要です。

H.264を選ぶ理由

a08f4a7eccc7197cdbbfaff72b69ad6e.png

上の画像は、Apple の公式 Web サイトのスクリーンショットから取得した画像で、この画像を基に 2 つのファイルを作成しました。

  • Apple公式サイトのホームページのスクリーンショットのPNGファイル、サイズは1015KB

  • 同じApple公式サイトのホームページのスクリーンショットを元に、H.264で作成した長さ5秒、フレームレート60fpsの動画ファイル、サイズ175KB

そうです、5 秒の動画ファイルの方が小さいのです。

ビデオは 1 秒あたり 60 fps、合計 5 秒、つまり 300 フレーム (300 の画像マトリックス)、つまり、ビデオには PNG 画像の 300 倍のデータがありますが、ファイル サイズは PNG 画像の 5 分の 1 です。 PNG 画像。

どのようにしましたか?H.264 はビデオ内の重要でないデータをすべて破棄し、重要なデータのみを残します。つまり、H.264 は非可逆圧縮アルゴリズムであるのに対し、PNG は可逆圧縮アルゴリズムです。

H.264 はどのデータが重要かをどのように判断しますか? 重要でないものはどれですか? それがH.264の核心です。

H.264が実際にどのようにそれを行うか

34d2273c2e5928ba7a86752e66e4f6c2.png左は元の画像、右は非可逆圧縮後の画像です. 右側の画像を観察してください. Apple ノートブックのオーディオ ホール. これらの穴は元の画像 (左) では明らかですが、非可逆圧縮後には、ぼやけています。この写真では、非可逆圧縮後、サイズは元のサイズの 7% になり、サウンド ホールと同様の効果は、注意深く観察することによってのみ肉眼で確認できます。

周波数ドメイン

情報理論では、エントロピーを使用して、コンテンツに含まれる情報の量を定量化します。

多くの場合、内容は異なる形式で表現されますが、情報量は同じ、つまりエントロピーは変わりません.典型的な例として、バイナリを使用してデータを表現することができます.同じデータを表すために 16 進数で実験してください. 2 進数と 10 進数ですが 16 進数の形式は異なりますが、2 つのエントロピーは変更されていません. 任意のデータのこの形式変換を完全なロスレス変換と呼ぶことができます.

そうです、画像などのデータもロスレスで変換できます。

空間または時間とともに変化するデータ セット (画像の明るさの値など) を別の座標空間に変換できると想像してください. 今、(xy 座標系ではなく) 周波数座標系があり、FreqX とFreqY は座標軸です。画像を無損失で周波数座標系に変換できます。つまり、画像はエントロピーを変更せずに表現に変更されます。

下の図に示すように、Apple ノートブックの画像を周波数座標の表現に変換します。

5dec0692e88ccc09eec3d323a7c5e2e6.png

周波数座標系で内容を見ると、強調表示されている点が画像内の情報量の多いデータであり、周波数座標の表示から、画像内の重要な部分と重要でない部分が少なくなることがわかります。次の図に示すように、画像の一部が破棄され、画像の非可逆圧縮が実現されます。

8d9169eb9afddbbb88b527104e05b972.png

図からわかるように、周波数座標で破棄するエッジ情報が多いほど、画像は小さくなり、画像圧縮が達成されます。

H.264 はこのトリックを使用してビデオのフレーム画像圧縮を実現しますが、それだけでは十分ではありません。

彩度サンプリング

科学的研究に基づいて, 人間の目の対応する脳領域は色の詳細を区別するのが得意ではないことがわかっています. 私たちは明るさの変化には敏感ですが, 色の変化には敏感ではありません. 画像内のいくつかの色を破棄すると. , 私たちは変化を感じません. したがって、画像をさらに圧縮するために、画像内の色情報の一部を合理的に破棄する何らかの方法が必要です.

テレビ信号では、R+G+B の色データを無損失で Y+Cb+Cr に変換して表示します。ここで、Y は明るさ (本質的には白黒の明るさ)、Cb と Cr の色成分、RGB を表します。 YCbCr、および情報エントロピーは変化しません。

TV が RGB を直接使用せず、レイヤーに切り替えて YCbCr を使用するのはなぜですか? 実際、それは歴史的な理由です。

初期は白黒テレビしかなく、Y信号だけでデータ伝送が完了していましたが、その後カラーテレビが出てきて、カラーテレビと白黒テレビが共存する時代に入りました。 . カラーテレビでRGBを使用する場合、独立した2つのデータストリームを取得する必要があり、これは非常に面倒です(コストとメンテナンスの両方が面倒です).

賢い技術者は、カラー情報を Cb と Cr にエンコードし、Y 情報と一緒に送信することを決定しました。これにより、白黒テレビは Y 情報のみを見ることができ、カラー テレビは YCbCr を RGB に変換して表示できます。

人間の目は明るさの変化には敏感ですが、色の変化には敏感ではないため、Cb、Cr を圧縮して、人間の目で違いを認識せずに画像サイズを半分に縮小することができます。

モーション推定と補償

以前の圧縮方法はすべてフレーム内、つまり画像用であり、ビデオには別の大きな圧縮スペースがあり、フレーム間 (フレーム間) の情報です。

H.264 は、モーション推定と補正を使用してフレーム間情報を圧縮し、ビデオのサイズを大幅に縮小します。

まず第一に, ビデオは順番に配置された一連のフレームで構成されており, これらのフレームの情報の大部分は冗長であることを知っています. たとえば, 30 fpsでビデオを撮影すると,ビデオの 1 秒間に 30 fps があります.これらの 30 枚の画像の内容は通常似ています.これらの冗長な情報を破棄してビデオのサイズを小さくする方法はありますか?

もちろん、モーション推定と補償はこの問題の解決策ですが、理解するために、他の記事 (翻訳以外の記事) から例を選択しました。

現在、ビリヤードの動きを記録したビデオがあります。

c634903e70a47846da0e88923f2cf194.png

ビデオを展開すると、一連のフレームになります。

903e862c082158407316f9ccd4d646fe.png

ビデオを取得した後、最初のステップはビデオ内の類似したフレームをグループ化することですが、いくつかのフレームが類似していると判断するにはどうすればよいでしょうか?

H.264 エンコーダーは、隣接する 2 つのフレームを順次抽出し、それらをマクロブロック単位で比較して、2 つのフレーム間の類似性を計算します。

これには、マクロブロックという新しい概念が含まれます。実際、これは H.264 が画像を処理するときのウィンドウ サイズです。

17b9525a8d2677265a68d9e030b12713.png

H.264 は、デフォルトでマクロブロックをサイズで分割します。もちろん、サイズで分割することもできます。

8502a9af9d8a9d869e8e1b00996aa827.png

H.264 エンコーダーは、マクロブロック スキャンとマクロブロック検索によって 2 つのフレーム間の類似性を判断し、類似したフレームをグループに分割します。

フレームの同じグループに対して、モーション推定と補正が実行されます。

まず、同じグループの隣接する 2 つのフレームを取り出します。マクロブロックスキャンにより、画像内にオブジェクトがあれば、別のフレームの画像で同じ位置の周りを検索し、別のフレームの画像にもオブジェクトが見つかった場合、オブジェクトのランニングベクトルを計算できます。1db0d382053df6538fdbd915d434f983.png

上図のように、隣り合う2枚の画像のビリヤードの位置の差を計算し、ビリヤードの走る方向と距離を計算します。

H.264 エンコーダーは、次の図に示すように、各フレームのボールの移動距離と方向を順番に記録します。

e5686b7d2bebcc2376330c028105c15c.png

動きベクトルが計算された後、データの同じ部分が破棄され、残りのデータは補正データです. このフレーム グループでは、完全な最初のフレーム データ (I フレームと呼ばれる) と補正データを保存して復元するだけで済みます。このアプローチにより、フレーム間の大量の冗長データが圧縮されます。

モーション推定および補正アルゴリズムはビデオ サイズを圧縮しますが、次のような小さな問題も引き起こします。

動画 Web サイトで動画を閲覧しているときに、コンテンツの一部を見逃してクリックして戻りたい場合、もう一度再生すると、通常、Web サイトは数秒間一時停止します。これらのコンテンツは今キャッシュされましたが、私はそれらを読んでいませんでした。戻って見たいのですが、それでも停止するのはなぜですか?キャッシュされた情報を直接読み取ることはできませんか?

ビデオの任意のフレームにジャンプすると、H.264 デコーダーはすべての計算をやり直してモーション ベクトルと補正データを取得し、これらのデータを現在のフレームに追加する必要があります。この計算圧力は比較的高いため、しばらく一時停止し、エクスペリエンスに影響します。

Entropy Coder (エントリーコーダー)

先ほどの説明では、動きベクトルと補正データを取得するプロセスを簡略化しましたが、実際には、H.264 エンコーダーがフレームをグループ化した後、グループの最初のフレームを I フレームとして使用し、次に 2 つの方法を使用してモーション ベクトルを取得します。1 つは P フレーム、もう 1 つは B フレームです。

P フレームは前のフレームとのみ比較してデータを取得し、B フレームは前後のフレームと比較してデータを取得します。

実際のビデオでは、フレームが変わると、いくつかのマクロブロックをスキャンして比較することによって得られる動きベクトルが同じである可能性が高く、データの冗長性が生じます。

このデータの冗長性は、エントロピー エンコーダーによって処理されます。これは、データを失うことのないロスレス変換ですが、同じデータを保存するために必要なスペースを減らすことでビデオのサイズを小さくします。

終わり

元の動画の解像度が、長さ 5 秒、1 秒あたり 60 フレームの場合、元の動画のサイズは次のようになります。圧縮後、動画は 175kb になります。

H.264 には数十年の研究の歴史があります. この記事では、関連する作業について簡単に説明しますが、多くの詳細は示されていません. H.264 も長年にわたって開発され、徐々に現在の形に最適化されてきました.

Erliang です。次の記事でお会いしましょう。

この記事の参考文献:

  • 【H.264は魔法】https://sidbala.com/h-264-is-magic/

  • 【動画圧縮原理】 https://github.com/733gh/Android-Notes/blob/master/android/%E8%A7%86%E9%A2%91%E5%8E%8B%E7%BC%A9% E5%8E%9F%E7%90%86.md

おすすめ

転載: blog.csdn.net/weixin_30230009/article/details/126047123