オーディオとビデオの開発ツアー (56) - H264/AVC の基本構造

この記事から、主に3つの段階に分かれるH264の学習実践に入ります

  1. H264の基本構造を学びます。

  2. 特定のエンコードおよび圧縮技術を理解する。

  3. 関連するオープン ソース ライブラリ x264 および h264bitstream を分析して理解します。

この記事で一緒にH264の基本構造を学びましょう

目次

  1. H264/AVC の目標と解決策

  2. H264 階層 - VCL と NAL

  3. NALU HEAD分析

  4. WAVEペイロード

  5. I/P/Bフレームの特徴

  6. スライスとマクロブロック

  7. 材料

  8. 褒美

1. H264/AVC の目的と解決策

オーディオおよびビデオのコーディング標準は、標準開発組織によって策定されます。主な組織は、ISO (国際標準化機構および国際電気標準会議) と ITU-T (国際電気通信連合の電気通信標準化部門) の 2 つです。

MPEG-1、MPEG-2、MPEG-4 part2、ISO 開発
H.261、H.262、H.263、ITU-T 規格
H264/MPEG-4 part10 および HEVC (h265) ISO および ITU-T など関節製剤

H.264 の主な目標:

1) 映像圧縮率が高く、当初提案されたインデックスはH.263やMPEG-4の約2倍であり、現在は基本的に実現されている; 2) ネットワークとの親和性が高く、さまざまなトランスポートネットワークに適用できる
.
このため、H.264 の機能は、ビデオ コーディング レイヤー (VCL) とネットワーク アブストラクション レイヤー (NAL) の 2 つのレイヤーに分割されます。
VCL データはエンコード プロセスの出力であり、圧縮エンコードされたビデオ データ シーケンスを表します。
VCL データの送信または保存の前に、これらのエンコードされた VCL データは、最初に NAL ユニットにマップまたはカプセル化されます。

h264エンコードの主な処理

写真

圧縮技術
H264/MPEG-4 part10 は、広く使用されているコーディング標準プロトコルです
。目標を達成するために、H264 は H263 に基づいて次の圧縮技術を追加します。

1. 双向运动补偿
2. 以小块进行的可变块运动补偿
3. 四分之一像素运动补偿
4. 环路滤波器
5. 变长编码
6. 加权预测
7. 可伸缩视频编码
8. 多视点编码等

2、H264 階層構造 - VCL と NAL

最後のセクションでは、H264 の 2 つの目標を達成するために、H264 はビデオ コーディング レイヤー (VCL、ビデオ コーディング レイヤー) とネットワーク抽象化レイヤー (NAL、ネットワーク アブストラクション レイヤー) という機能的に階層化されています。
その中でも、コア圧縮エンジンとブロック、マクロブロック、スライスの構文レベル定義を含む VCL (Video Coding Layer) ビデオ コーディング レイヤーは、ネットワークとは独立して可能な限り効率的にエンコードするように設計されており、効果的に処理を担当します。動画データの内容を表します。
NAL (ネットワーク アブストラクション レイヤー) ネットワーク アブストラクション レイヤーは、VCL によって生成されたビット文字列をさまざまなネットワークや複数の環境に適応させ、スライス レベルより上のすべての構文レベルをカバーします; NALU ユニットは多くの場合、[NALU ヘッダー] + [NALUペイロード]部分、
NALはVCLをカプセル化します

写真

画像: VCL & NAL (H.264/AVC)

3. NALU HEADの分析

H264 を分析するために、まず次のコマンドでビデオを抽出します。

保留编码格式:ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264

强制格式:ffmpeg -i test.mp4 -vcodec libx264 -an test.h264

次に、次のように、抽出した h264 ファイルを 010Editor で開きます。

写真

H264 は 2 つのストリーム形式に分割されます。1 つは Annex-B 形式 (これは上の図に示されている形式です)、もう 1 つは RTP パケット ストリーム形式です。
Annex-B 形式がデフォルトの出力形式です。データ単位分割は、スタートコードとして[StartCode](0x000001または0x00000001)を使用します。

NALU ユニットは通常、[NALU ヘッダー] [NALU ペイロード] で構成され、

NALU ヘッダーは、StartCode の直後のバイトであり、ビットに従って 3 つのブロックに分割されます。

写真

このうち、1ビット目は禁止ビットであり、NALUユニットの使用を禁止する場合は1、使用を許可する場合は0である。
ビット 2 ~ 3 は重要度を示す基準レベル (NRI、NAL ref idc) で、値が大きいほど重要度が高くなります。例えば、フレームロス処理を行う場合、この2ビットで信頼できるフレームかどうかを判断し、破棄できるかどうかを判断します。
最後の 5 ビットは NLAU のタイプを示し、その値の意味を次の表に示します。

写真

画像: https://zhuanlan.zhihu.com/p/71928833

NAL タイプは、VCL と非 VCL の 2 つのカテゴリに分けられます。画像データを含むユニットは VCL NAL ユニットに属し、SPS、PPS、および SEI は非 VCL NAL ユニットに属します。

h264 スクリーンショットの 06、67、68 の意味を見てみましょう。

0x06 -- バイナリ化 -- "00000110 -- 最後の 5 桁を取る --" 000 00110 値ビット 6、上記の表を確認すると、SEI がビデオ ストリームに追加情報を追加できる補足拡張情報ユニットであることがわかります

0x67 -- バイナリ化 -- "01100111 -- 最後の 5 桁を取る --" 000 00111 値ビット 7、上の表を確認すると、SPS、つまりシーケンス パラメータ セットであることがわかります。符号化されたビデオ シーケンス (Coded Video Sequence) グローバル パラメータ

0x68 -- バイナリ化 -- "01101000 -- 最後の 5 桁を取る --" 000 01000 値のビット 8、上の表を確認すると、PPS、つまり画像パラメータ セットに関連するパラメータが格納されていることがわかります。全体像。

上記に加えて、00 00 00 01 41、または 00 00 00 01 01 があるので、41 と 01 は何ですか?

0x41 -- バイナリ化 -- "01000001 -- 最後の 5 桁を取る --" 000 00001 値のビット 1、上記の表を確認し、それが I/P/B フレームの可能性がある非 IDR フレームであることを確認します

その中で、IDR は一種の I フレームであり、これまで依存していた一連のデコード パラメータを更新できることをデコーダに伝えます。

0x01 -- バイナリ化 -- "00000001 -- 最後の 5 桁を取る --" 000 00001 値のビット 1。上記の表を確認し、それが I/P/B フレームの可能性がある非 IDR フレームであることを確認します。 41 と比較して、このフレームはより重要であり、非常に低く、破棄することができます

写真

4.NALUペイロード

NALU の本体には、EBSP、RBSP、SODB という 3 つの重要な用語が含まれています。その中で、EBSP は NALU の本体と完全に同等であり、両者の構造上の関係は、
EBSP には RBSP が含まれ、RBSP には SODB が含まれます。

1. SODB: String Of Data Bits 元のデータ ビット ストリーム。最も元のエンコード/圧縮データです。

2. RBSP: Raw Byte Sequence Payload。Raw Byte Sequence Payload とも呼ばれます。

SODB との関係は次のとおりです。

RBSP = SODB + RBSP トレーリング ビット (RBSP トレーリング バイト) は、
8 ビット バイト パディングの RBSP トレーリング ビットを導入します。

3. EBSP: カプセル化されたバイト シーケンス ペイロード: 拡張バイト シーケンス ペイロード

0x000001StartCode (または)も RBSP に含まれている場合は0x00000001どうなりますか? そのため、アンチコンペティション バイト ( 0x03) があります。エンコード時に RBSP をスキャンし、2 つの連続する0x00バイトが検出された場合は、アンチ コンペティション バイト ( 0x03) を追加し、デコード時にも EBSP をスキャンして逆の操作を実行します。

写真

画像元: ビデオとビデオ フレーム: H264 エンコード形式の配置

写真

出典:H264/AVC 構文・意味詳細解説③:NALU詳細解説2(EBSP、RBSP、SODB)

5. I/P/Bフレームの特徴

3 番目のセクションでは、NAL の Type テーブルを通じて学習しました。5はIDRフレームを表し、1は非IDRフレームを表す。このセクションでは、ビデオの I/P/B フレームを見てみましょう。

写真

I フレーム: イントラ ピクチャ、キー フレーム、I フレームは通常、P/B フレームの参照フレームとして、イントラ フレーム予測圧縮の各 GOP の最初のフレームです。
I フレームの特徴は次のとおりです。

    它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输; 
    解码时仅用I帧的数据就可重构完整图像; 
    I帧描述了图像背景和运动主体的详情; 
    I帧不需要参考其他画面而生成; 
    I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量); 
    I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧; 
    I帧不需要考虑运动矢量; 
    I帧所占数据的信息量比较大。

P フレーム: 前方予測コーディング フレーム予測フレーム、主にフレーム間コーディング用、前の I/P フレームを参照、時間冗長情報を削除、P フレームには完全な画像データがなく、前の I/P と異なるデータのみ絵。デコード時には、このフレームの差分データを前にキャッシュされた I/P フレームに重ね合わせる必要があり、
最終的な画像 P フレームを生成する特徴は次のとおりです。

    P帧是I帧后面相隔1~2帧的编码帧; 
    P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差); 
    解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像; 
    P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧; 
    P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧; 
    由于P帧是参考帧,它可能造成解码错误的扩散; 
    由于是差值传送,P帧的压缩比较高。

Bフレーム:前のI/Pフレームと次のPフレームの間の時間冗長情報を考慮して送信データ量の符号化画像を圧縮する双方向補間予測フレームで、前のI/PフレームだけでなくBフレームを復号する。キャッシュされた画像とデコードされた画像は、現在のフレーム データに前後の画像を重ね合わせて最終的な画像を取得するためにも使用されます。B フレームは圧縮率が高いですが、デコード時に CPU をより多く消費します。
B フレームの特徴は次のとおりです。

    B帧是由前面的I或P帧和后面的P帧来进行预测的; 
    B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量; 
    B帧是双向预测编码帧; 
    B帧压缩比最高,因为它只反映参考帧间运动主体的变化情况,预测比较准确; 
    B帧不是参考帧,不会造成解码错误的扩散。

GOP: There are a image sequence between two I frames. 主に、1 つの i フレームと次の i フレームの間にいくつのフレームがあるかを説明するために使用されます. シーケンスの最初の画像は IDR 画像です (画像をすぐに更新する), IDR画像はすべて I フレーム画像です。
GOP ピクチャ グループを拡大すると、エンコード後のビデオ ボリュームを効果的に減らすことができますが、ビデオの品質も低下します。
GOP が長くなるほど、B フレームの割合が高くなり、エンコードのパフォーマンス要件が高くなります。

H.264 Video ES Viewer ツールを使用して test.264 ファイルを開き、各 NAL のタイプ、VCL データのサイズ、およびフレーム タイプを表示します。

写真

6、スライス スライスとマクロブロック

GOP、フレーム、スライス、マクロの関係

写真

スライスの主な機能は、マクロブロック (マクロブロック) のキャリアとして使用されることであり、その目的は、エラーの拡散と伝達を制限することです。
ビットエラーの拡散と送信を制限するには?
各スライス (スライス) は互いに独立して送信する必要があり、あるスライスの予測 (スライス内予測およびスライス間予測) では、他のスライス内のマクロブロック (マクロブロック) を参照画像として使用することはできません。

各シャードには、ヘッダーとデータの 2 つの部分も含まれます。

写真

スライス ヘッダーには、スライス タイプ、マクロブロック タイプ、フレーム数、スライスが属するイメージ、および対応するフレーム設定とパラメータなどの情報が含まれます。
スライス データはマクロ ブロックです。ピクセル (YUV) データを保存する場所を探しています。

マクロブロックとは

写真

マクロブロックは、各ピクセルの輝度とクロミナンス情報を含むため、ビデオ情報の主要なキャリアです。ビデオ デコードの主な仕事は、コード ストリームからマクロブロック内のピクセル配列を取得する効率的な方法を提供することです。

コンポーネント: マクロブロックは、16×16 輝度ピクセルと、追加の 8×8 Cb および 8×8 Cr カラー ピクセル ブロックで構成されます。各ピクチャには、いくつかのマクロブロックがスライスの形で配置されています。

一般的に使用されるマクロブロック タイプ
I マクロブロック: イントラ予測マクロブロックは I/P/B フレームに配置される場合があります (イントラ フレーム予測は P および B フレームでも可能であるため) P マクロブロック: 単方向のフレーム間予測が使用され

P フレームの B マクロブロック: 双方向のフレーム間予測を採用し、B フレームにのみ存在します。

スライスタイプとマクロブロックタイプの関係

I スライス: I マクロブロックのみを含み、I マクロブロックは現在のスライスのデコードされたピクセルをフレーム内予測の参照として使用します (他のスライスのデコードされたピクセルはフレーム内予測の参照として使用できません)。
P スライス: P マクロブロックと I マクロブロックを含むことができます. P マクロブロックは、以前に符号化された画像をフレーム内予測の参照画像として使用します. イントラ符号化されたマクロブロックは、さらにマクロブロックに分割できます: 16x16, 16x 8. 8x 16 または 8×8 輝度ピクセル ブロック (および付随するカラー ピクセル); 8×8 サブマクロブロックが選択されている場合、8×8、8×4、4×8 のサイズのさまざまなサブマクロブロックに分割できます。 、または 4×4 輝度ピクセル ブロック (および付随するカラー ピクセル)。
B スライス: B および I マクロブロックを含むことができ、B マクロブロックはフレーム内予測に双方向参照画像 (現在および将来の符号化画像フレーム) を使用します。
SP スライス (スイッチング P): P および/または I マクロブロックを含む、異なるコード化ストリーム間のスイッチングに使用されます
SI スライス: 拡張プロファイルでスイッチングが必要です。拡張プロファイルで機能します。

H264Visa ツールを使用して、h264 の NALU、スライス、マクロブロック、および YUV データを次のように表示します。

写真

7. 情報

この記事の内容の多くは、以下の参考資料を学習し、独自の理解に基づいて整理して記述し、コード ストリーム解析ツールを使用して表示および分析したものです。次の著者の出力に感謝します。

  1. 著書「ビデオコーディングをあらゆる角度から徹底解説」

  2. 著書「新世代映像圧縮符号化規格 H.264/AVC」

  3. Li Chao-H264 基本原則 (https://zhuanlan.zhihu.com/p/31056455)

  4. ビデオ コーディングの H264 構造の簡単な理解 (https://philm.gitbook.io/philm-ios-wiki/mei-zhou-yue-du/shen-ru-qian-chu-li-jie-shi-pin-bian- ma -h264-jie-gou)

  5. ビデオとビデオ フレーム: H264 エンコード形式の配置 (https://zhuanlan.zhihu.com/p/71928833)

  6. H264エンコーディングまとめ(https://www.jianshu.com/p/0c296b05ef2a)

  7. VCL & NAL (H.264/AVC)(https://www.jianshu.com/p/eeecb0eb2c6e)

8.収穫

この記事の勉強を通して

  1. H264 VCL の構造と NAL のレイヤリングを理解する

  2. NALU HEAD、SPS、PPS、SEI、IDR、non-IDRなどに対応するバイトの意味と型を理解し、I/P/Bフレームの特徴を理解する

  3. NALUペイロードの構造を理解する

  4. フレーム スライスとマクロブロックの定義と目的を理解します。

  5. コード ストリーム分析ツールと実践を組み合わせることで、理解を深めます。

次の記事をお読みいただきありがとうございます
. H264符号化技術のフレーム内予測を解析し学びます. 公式アカウント「Audio and Video Development Journey」に注目し、共に学び成長してください.
交換へようこそ

おすすめ

転載: blog.csdn.net/u011570979/article/details/120102231