H264基本概念研究ノート
- NALU(ネットワーク抽象化レイヤーユニット)
- GOP(Group of Pictures)は、主に1つのIDRフレームと次のIDRフレームの間のフレーム数を表すために使用されます。
- H264は、シーケンス(GOP)、画像(pictrue)、スライス(Slice)、マクロブロック(Macroblock )、およびサブブロック(subblock)の5つのレベルに編成します。
- H264は、ビデオを連続するフレームに分割して送信し、連続するフレーム間でI 、P、およびBフレームを使用します。同時に、フレーム内コンテンツの場合、画像は送信用にブロック、マクロブロック、ワードブロックに分割されます。このプロセスにより、ビデオファイルの圧縮とパッケージ化が実現されます。
- IDR(瞬時デコードリフレッシュ、瞬時デコードリフレッシュ)。
- シーケンスの最初の画像は、IDR画像と呼ばれている(すなわち、リフレッシュ画像)、およびIDRの画像が全てであるI-フレーム画像
- そのコア機能は、デコードを再同期することです。デコーダーがIDRイメージをデコードすると、参照フレームキューがすぐにクリアされ、デコードされたすべてのデータが出力または破棄され、パラメーターセットが再度検索され、新しいパラメーターセットが開始されます。
- Bフレームは参照フレームとして使用できません。
NALU
- SPS:シーケンスパラメータセット。コード化されたビデオシーケンス(コード化されたビデオシーケンス)のグローバルパラメータのセットがSPSに保存されます。
- PPS:画像パラメータセット。シーケンス内の特定の画像または特定の画像のパラメータに対応します。
- Iフレーム:フレーム内でコード化されたフレーム。個別にデコードして完全な画像を生成できます。
- Pフレーム:前方予測コーディングフレーム。完全な画像を作成するには、前のIまたはBを参照する必要があります。
- Bフレーム:双方向予測補間コーディングフレーム。完全な画像を作成するには、前のIまたはPフレームと次のPフレームを参照する必要があります。
- Iフレームを送信する前に、SPSとPPSを少なくとも1回送信する必要があります。
NALU構造
- 元のH.264ストリーム(ベアストリーム)は1つのNALUで構成され、その機能は2つのレイヤーに分割されています。
- VCL(Video Coding Layer):コア圧縮エンジンとブロック、マクロブロックと構文レベルの定義を含み、設計目標は、効率的なコーディングのためにネットワークにできるだけ固有にすることです。
- NAL(オープンネットワーク抽出レイヤー):VCLは、結果の文字列を関連付けます⽐さまざまな環境やポリオールに適合したレイドオープンネットワークで、文法レベルより上のすべての静止画レベルをカバーします
- VCLでのデータ送信または保存の前に、これらのエンコードされたVCLデータはNALユニットにマッピングまたはカプセル化されます。
- 1 NALU =ビデオエンコーディングに対応する1セットのNALUヘッダー情報+1つのrawバイトシーケンスペイロード(RBSP、Rawバイトシーケンスペイロード)
- NALU構造ユニットの主な構造は次のとおりです。
- オリジナルのH.264NALUユニットは通常、次の3つの部分で構成されています。[StartCode] [NALU Header] [NALU Payload]
- スタートコードは、これはNALU単位の始まりであり、それは「00 00 00 01」または「00 00 01」でなければならないことを示すために使用されます
- さらに、基本的にNALヘッダー+ RBSPと同等です。
- FFmpegが逆多重化された後、MP4ファイルから読み取られたパケットにはスタートコードが含まれていませんが、TSファイルから読み取られたパケットにはスタートコードが含まれています。
NALUを分析する
- 各NALユニットは、特定の構文要素の可変バイト文字列であり、1バイトのヘッダー情報(データ型を示すために使用)と数バイトのペイロードデータが含まれます。
- NALUヘッダー情報(1バイト):
(注:画像参照:https://www.jianshu.com/p/31ed32fd7b6b)
- Tは負荷データ型で、5ビットを占有します
- nal_unit_typeは:の種類このNALUのユニット1へ12が使用されていることにより、H.264 、および24に31を使用しているアプリケーションによって以外H.264
- Rは重要度インジケータであり、2ビットを占めます
- nal_ref_idc。:00〜11を取ります。これは、このNALUの重要性を示しているようです。
- 例えば、NALU用のデコーダ00は、映像の再生、0影響を与えることなく、それを破棄することができるまで3を、大きな値、より重要な現在のNALが、それが最初に保護する必要があります。
- 現在のNALが参照フレーム、シーケンスパラメータセット、または画像パラメータセットの重要な単位である場合、この構文要素は0より大きくなければなりません。
- Fは禁止位置で、1ビットを占有します
- forbidden_zero_bit :このビットは0でなければならないことがH.264仕様で指定されています
- H.264こと標準状態データストリームが媒体上に記憶されている場合、:開始コード0x000001のまたは0x00000001のがされる前に、追加各NALUを示すための開始および終了位置NALUを:
- このメカニズムでは、開始コードはNALUの開始識別子としてコードストリームで検出されます。次の開始コードが検出されると、現在のNALUは終了します。
- 3バイトの0x000001のが唯一である時に使用される場合、完全なフレームを複数のスライス(スライス)にコンパイルされ、NALUこれらのスライスを含むが使用3-バイトのスタートコード。
- それ以外の場合は、4バイト0x00000001です。
H264annexbモード
- H264には2つのパッケージがあります。
- Annexbモード、従来のモード、スタートコード、SPS、PPSはESにあります(「 H264ES PS TSストリームの違い」 https://blog.csdn.net/coloriy/article/details/80623192を参照)。
- mp4モード、通常どおりに撮影mp4 MKVはmp4モードで、スタートコード、SPS、PPSはなく、その他の情報はコンテナにパッケージ化されます。各⼀⾯フレームは⻓のフレームの4バイトです。
- 多くのデコーダは唯一annexbモードをサポートしていますが、変換する必要があるので、MP4 :使用h264_mp4toannexb_filteの変換を行うにRでffmpegのを
const AVBitStreamFilter *bsfilter = av_bsf_get_by_name("h264_mp4toannexb"); AVBSFContext *bsf_ctx = NULL; // 2 初始化过滤器上下⽂ av_bsf_alloc(bsfilter, &bsf_ctx); //AVBSFContext; // 3 添加解码器属性 6avcodec_parameters_copy(bsf_ctx->par_in, ifmt_ctx->streams[videoindex]->cod ecpar); av_bsf_init(bsf_ctx);
GOP Group of Pictures
- ビデオコーディングシーケンスでは、GOPはGroup of picturesの略で、2つのIフレーム間の距離を指します。
- 参照(参照期間)とは、2つのPフレーム間の距離を指します。
- 1つのIフレームは1つのPフレームよりも多くのバイトを占有し、1つのPフレームは1つのBフレームよりも多くのバイトを占有します。
- したがって、同じビットレートを前提として、GOP値が大きいほど、PフレームとBフレームの数が多くなり、各I 、P 、およびBフレームが占める平均バイト数が多くなります。より良い画質を得る;リファレンスが大きいほど、Bフレームの数が多くなり、同様に、より良い画質を得るのが簡単になります。
- GOP値を大きくして画質を向上させるには限界があります。シーン切り替えの場合、H.264エンコーダーは自動的かつ強制的にIフレームを挿入します。このとき、実際のGOP値は短くなります。
- GOP、P及びBフレームは、Iフレームにより予測される。Iフレームの画質が低い場合、それは次のGOPまでGOP内の後続のP及びBフレームの画質に影響を与える。それはあります最初から回復できるので、GOP値を大きく設定しすぎないでください。
- 以来の複雑PとBのフレームのものよりも大きいIフレーム、あまりにも多くのP及びBフレームは、符号化効率に影響を与え、符号化効率が低下します。
- さらに、過剰なGOPは、シーク操作の応答速度にも影響します。PフレームとBフレームは、前のIまたはPフレームから予測されるため、シーク操作を直接配置する必要があります。特定のPまたはBフレームをデコードする場合、復号された提示する必要GOPの中のI -フレームと前N-番目のフレームの予測缶、GOPは、⻓より、複数の予測フレームを復号する値シークより⻓時間応答。
- 拡張:https: //www.jianshu.com/p/31ed32fd7b6bを参照して ください