web-dev-qa-db-ja.com

このH264 NALヘッダーの意味は何ですか?

0000 0109 1000 0001 6742 0020 e900 800c
3200 0001 68ce 3c80 0000 0001 6588 801a

私の知る限り、00 01は、NALユニットを識別するための開始プレフィックスコードです。 「09 ....」とはどういう意味ですか?ヘッダータイプバイトですか?

24
ablmf

0x000001はNALの開始プレフィックスコードです(エンコーダーの実装によっては0x00000001になることもあります)。 0x09は0b00001001、つまりF = 0、NRI = 0、タイプは0b01001です。その特定のタイプは、アクセス単位の区切り文字です。その直後に、シーケンスパラメータセットである7のNALタイプである0x67で定義された別のNALユニットが続くことに注意してください。

画像パラメータセットもあります。

00 0001 68 ...

...そしてキーフレームの開始:

0000 0001 65 ...

36
kidjan

あなたが見ているNALの種類を理解するための重要な参照は http://www.itu.int/rec/T-REC-H.264-201304-S です。特に、63ページの表(2014年1月現在)には、有効なNALタイプがすべてリストされています。

あなたが探しているものを理解するには、最初の4バイトを見てください。 NALが「Annex B」フレーミングにある場合、00 00 01または00 00 00 01。このシーケンスはH.264ビットストリーム内で禁止/抑制されているため、これを見ると、NALの開始を確認していることが確実にわかります。 NALタイプは、1の後の下位5ビットです。コードでは、

int nalType = p[2] == 1 ? (p[3] & 0x1f) : (p[4] & 0x1f);

また、H.264の専門用語では、IDRはIフレームを意味し、非IDRはPまたはBフレームを意味します。

上記の情報を使用して、上記のストリームを確認し、SPS、PPS、および最初のIフレームが後に続くアクセスユニットの区切り文字を確認できます。

12
Yaur
    0000 0109 1000 0001 6742 0020 e900 800c
    3200 0001 68ce 3c80 0000 0001 6588 801a

-> 000001| 09 (AUD)| 10 | 000001 | 67(SPS) | xxxx (SPS data)
   xx | 000001 | 68 (PPS)| xxxx (PPS data)

AUD、SPS、PPSはNALUのタイプ(ネットワークアブストラクションレイヤーユニット)です)NALUには約31のタイプがあります。

09 AUDは、アクセス単位区切り文字を意味します。

アクセス単位区切り文字(AUD)。 AUDは、エレメンタリーストリームのフレームを区切るために使用できるオプションのNALUです。これは必須ではなく(TSのようにコンテナー/プロトコルで特に明記されていない限り)、多くの場合、スペースを節約するために含まれていませんが、各NALUを完全に解析せずにフレームの開始を見つけるのに役立ちます。

詳細については、この answer を確認してください。

(iOSで)h264ストリームをデコードする方法について question もあります。

7
Nhat Dinh

これにより、パケットタイプが定義されます。形式は次のとおりです。

+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI|  Type   |
+---------------+

これはh.264 NALヘッダーですか?あなたが提供したものから見ると、これは提供したコンテキストのヘッダーではないようです。

2
Matt