H.264ストリームのシーケンス/画像パラメータセットの可能な場所


84

私はH.264デコーダーに取り組んでおり、SPSとPPSはどこにあるのか疑問に思っています。私の参考文献によると、これらはH.264-StreamでエンコードされたNALユニットですが、IsoViewerを使用したMP4-Fileの例を見ると、SPSとPPSはavcCボックスにあると書かれています。

これはどの程度正確に機能しますか?.mkvファイルまたは他のH.264コンテナをどのように検索しますか?

前もって感謝します!

回答:


299

まず、単一の標準H.264基本ビットストリーム形式がないことを理解することが重要です。仕様書には、1つの可能な形式を説明する付録、特に付録Bが含まれていますが、実際の要件ではありません。この規格は、ビデオを個々のパケットにエンコードする方法を指定しています。これらのパケットがどのように保存および送信されるかは、インテグレータに公開されたままになります。


1.付録B

ネットワーク抽象化レイヤーユニット

パケットは、ネットワーク抽象化レイヤーユニットと呼ばれます。多くの場合、NALU(または単にNAL)と略され、各パケットは個別に解析および処理できます。各NALUの最初のバイトにはNALUタイプ、具体的にはビット3〜7が含まれます(ビット0は常にオフで、ビット1〜2はNALUが別のNALUによって参照されているかどうかを示します)。

VCLと非VCLの2つのカテゴリに分けて定義された19の異なるNALUタイプがあります。

  • VCL、またはビデオコーディングレイヤーパケットには、実際の視覚情報が含まれています。
  • 非VCLには、ビデオのデコードに必要な場合と不要な場合があるメタデータが含まれています。

単一のNALU、またはVCL NALUでさえ、フレームと同じものではありません。フレームは、いくつかのNALUに「スライス」することができます。ピザをスライスできるように。次に、1つ以上のスライスが、1つのフレームを含むアクセスユニット(AU)に仮想的にグループ化されます。スライスはわずかな品質コストがかかるため、あまり使用されません。

以下は、定義されているすべてのNALUの表です。

0      Unspecified                                                    non-VCL
1      Coded slice of a non-IDR picture                               VCL
2      Coded slice data partition A                                   VCL
3      Coded slice data partition B                                   VCL
4      Coded slice data partition C                                   VCL
5      Coded slice of an IDR picture                                  VCL
6      Supplemental enhancement information (SEI)                     non-VCL
7      Sequence parameter set                                         non-VCL
8      Picture parameter set                                          non-VCL
9      Access unit delimiter                                          non-VCL
10     End of sequence                                                non-VCL
11     End of stream                                                  non-VCL
12     Filler data                                                    non-VCL
13     Sequence parameter set extension                               non-VCL
14     Prefix NAL unit                                                non-VCL
15     Subset sequence parameter set                                  non-VCL
16     Depth parameter set                                            non-VCL
17..18 Reserved                                                       non-VCL
19     Coded slice of an auxiliary coded picture without partitioning non-VCL
20     Coded slice extension                                          non-VCL
21     Coded slice extension for depth view components                non-VCL
22..23 Reserved                                                       non-VCL
24..31 Unspecified                                                    non-VCL

知識を持っていることが後で役立つかもしれないNALUタイプがいくつかあります。

  • シーケンスパラメータセット(SPS)。この非VCLNALUには、プロファイル、レベル、解像度、フレームレートなど、デコーダーの構成に必要な情報が含まれています。
  • 画像パラメータセット(PPS)。SPSと同様に、この非VCLには、エントロピーコーディングモード、スライスグループ、モーション予測、および非ブロック化フィルターに関する情報が含まれています。
  • 瞬時デコーダーリフレッシュ(IDR)。このVCLNALUは、自己完結型の画像スライスです。つまり、IDRは、他のNALU保存SPSおよびPPSを参照せずにデコードおよび表示できます。
  • アクセスユニット区切り文字(AUD)。AUDは、エレメンタリストリームのフレームを区切るために使用できるオプションのNALUです。これは必須ではなく(TSのようにコンテナ/プロトコルで特に明記されていない限り)、スペースを節約するために含まれていないことがよくありますが、各NALUを完全に解析しなくてもフレームの開始を見つけるのに役立ちます。

NALUスタートコード

NALUに含まれていないのはそのサイズです。したがって、NALUを連結してストリームを作成するだけでは、1つがどこで停止し、次がどこから始まるかわからないため、機能しません。

付録B仕様は、各NALUの前に「開始コード」を要求することでこれを解決します。開始コードは、20x00バイトまたは3バイトの後に10x01バイトが続きます。例0x000001または0x00000001

4バイトのバリエーションは、31個のゼロビットの後に1を探すことによってストリームをバイト整列するのは簡単なので、シリアル接続を介した送信に役立ちます。次のビットが0の場合(すべてのNALUが0ビットで始まるため)、それはNALUの開始です。4バイトのバリエーションは通常、SPS PPS AUDやIDRなどのストリーム内のランダムアクセスポイントのシグナリングにのみ使用されますが、3バイトのバリエーションはスペースを節約するために他のすべての場所で使用されます。

エミュレーション防止バイト

スタートコード0x0000000x000001、RBSP以外のNALU内0x0000020x000003は4バイトシーケンス、、、およびが無効であるために機能します。したがって、NALUを作成するときは、開始コードと混同される可能性のあるこれらの値をエスケープするように注意が払われます。これは、「エミュレーション防止」バイトを挿入することによって実現される0x03ため、に0x000001なり0x00000301ます。

デコードするときは、エミュレーション防止バイトを探して無視することが重要です。エミュレーション防止バイトはNALU内のほぼどこにでも発生する可能性があるため、ドキュメントでは、バイトがすでに削除されていると想定する方が便利な場合がよくあります。エミュレーション防止バイトのない表現は、Raw Byte Sequence Payload(RBSP)と呼ばれます。

完全な例を見てみましょう。

0x0000 | 00 00 00 01 67 64 00 0A AC 72 84 44 26 84 00 00
0x0010 | 03 00 04 00 00 03 00 CA 3C 48 96 11 80 00 00 00
0x0020 | 01 68 E8 43 8F 13 21 30 00 00 01 65 88 81 00 05
0x0030 | 4E 7F 87 DF 61 A5 8B 95 EE A4 E9 38 B7 6A 30 6A
0x0040 | 71 B9 55 60 0B 76 2E B5 0E E4 80 59 27 B8 67 A9
0x0050 | 63 37 5E 82 20 55 FB E4 6A E9 37 35 72 E2 22 91
0x0060 | 9E 4D FF 60 86 CE 7E 42 B7 95 CE 2A E1 26 BE 87
0x0070 | 73 84 26 BA 16 36 F4 E6 9F 17 DA D8 64 75 54 B1
0x0080 | F3 45 0C 0B 3C 74 B3 9D BC EB 53 73 87 C3 0E 62
0x0090 | 47 48 62 CA 59 EB 86 3F 3A FA 86 B5 BF A8 6D 06
0x00A0 | 16 50 82 C4 CE 62 9E 4E E6 4C C7 30 3E DE A1 0B
0x00B0 | D8 83 0B B6 B8 28 BC A9 EB 77 43 FC 7A 17 94 85
0x00C0 | 21 CA 37 6B 30 95 B5 46 77 30 60 B7 12 D6 8C C5
0x00D0 | 54 85 29 D8 69 A9 6F 12 4E 71 DF E3 E2 B1 6B 6B
0x00E0 | BF 9F FB 2E 57 30 A9 69 76 C4 46 A2 DF FA 91 D9
0x00F0 | 50 74 55 1D 49 04 5A 1C D6 86 68 7C B6 61 48 6C
0x0100 | 96 E6 12 4C 27 AD BA C7 51 99 8E D0 F0 ED 8E F6
0x0110 | 65 79 79 A6 12 A1 95 DB C8 AE E3 B6 35 E6 8D BC
0x0120 | 48 A3 7F AF 4A 28 8A 53 E2 7E 68 08 9F 67 77 98
0x0130 | 52 DB 50 84 D6 5E 25 E1 4A 99 58 34 C7 11 D6 43
0x0140 | FF C4 FD 9A 44 16 D1 B2 FB 02 DB A1 89 69 34 C2
0x0150 | 32 55 98 F9 9B B2 31 3F 49 59 0C 06 8C DB A5 B2
0x0160 | 9D 7E 12 2F D0 87 94 44 E4 0A 76 EF 99 2D 91 18
0x0170 | 39 50 3B 29 3B F5 2C 97 73 48 91 83 B0 A6 F3 4B
0x0180 | 70 2F 1C 8F 3B 78 23 C6 AA 86 46 43 1D D7 2A 23
0x0190 | 5E 2C D9 48 0A F5 F5 2C D1 FB 3F F0 4B 78 37 E9
0x01A0 | 45 DD 72 CF 80 35 C3 95 07 F3 D9 06 E5 4A 58 76
0x01B0 | 03 6C 81 20 62 45 65 44 73 BC FE C1 9F 31 E5 DB
0x01C0 | 89 5C 6B 79 D8 68 90 D7 26 A8 A1 88 86 81 DC 9A
0x01D0 | 4F 40 A5 23 C7 DE BE 6F 76 AB 79 16 51 21 67 83
0x01E0 | 2E F3 D6 27 1A 42 C2 94 D1 5D 6C DB 4A 7A E2 CB
0x01F0 | 0B B0 68 0B BE 19 59 00 50 FC C0 BD 9D F5 F5 F8
0x0200 | A8 17 19 D6 B3 E9 74 BA 50 E5 2C 45 7B F9 93 EA
0x0210 | 5A F9 A9 30 B1 6F 5B 36 24 1E 8D 55 57 F4 CC 67
0x0220 | B2 65 6A A9 36 26 D0 06 B8 E2 E3 73 8B D1 C0 1C
0x0230 | 52 15 CA B5 AC 60 3E 36 42 F1 2C BD 99 77 AB A8
0x0240 | A9 A4 8E 9C 8B 84 DE 73 F0 91 29 97 AE DB AF D6
0x0250 | F8 5E 9B 86 B3 B3 03 B3 AC 75 6F A6 11 69 2F 3D
0x0260 | 3A CE FA 53 86 60 95 6C BB C5 4E F3

これは、3つのNALUを含む完全なAUです。ご覧のとおり、開始コードで始まり、その後にSPSが続きます(SPSは67で始まります)。SPS内には、2つのエミュレーション防止バイトが表示されます。これらのバイト0x000000がないと、これらの位置で不正なシーケンスが発生します。次に、開始コードとそれに続くPPS(PPSは68で始まります)、および1つの最終開始コードとそれに続くIDRスライスが表示されます。これは完全なH.264ストリームです。これらの値を16進エディターに入力し、.264拡張子を付けてファイルを保存すると、次の画像に変換できます。

レナ

付録Bは、トランスポートストリーム、無線放送、DVDなどのライブおよびストリーミング形式で一般的に使用されます。これらのフォーマットでは、SPSとPPSを定期的に繰り返し、通常はすべてのIDRの前に配置するため、デコーダーのランダムアクセスポイントが作成されます。これにより、すでに進行中のストリームに参加することができます。


2.AVCC

H.264ストリームを保存する他の一般的な方法は、AVCC形式です。この形式では、各NALUの前にその長さがあります(ビッグエンディアン形式)。この方法は解析が簡単ですが、Annex Bのバイトアラインメント機能が失われます。複雑にするために、長さは1、2、または4バイトを使用してエンコードされる場合があります。この値はヘッダーオブジェクトに格納されます。このヘッダーは、「extradata」または「sequenceheader」と呼ばれることがよくあります。その基本的な形式は次のとおりです。

bits    
8   version ( always 0x01 )
8   avc profile ( sps[0][1] )
8   avc compatibility ( sps[0][2] )
8   avc level ( sps[0][3] )
6   reserved ( all bits on )
2   NALULengthSizeMinusOne
3   reserved ( all bits on )
5   number of SPS NALUs (usually 1)

repeated once per SPS:
  16         SPS size
  variable   SPS NALU data

8   number of PPS NALUs (usually 1)

repeated once per PPS:
  16       PPS size
  variable PPS NALU data

上記と同じ例を使用すると、AVCCエクストラデータは次のようになります。

0x0000 | 01 64 00 0A FF E1 00 19 67 64 00 0A AC 72 84 44
0x0010 | 26 84 00 00 03 00 04 00 00 03 00 CA 3C 48 96 11
0x0020 | 80 01 00 07 68 E8 43 8F 13 21 30

SPSとPPSが帯域外に保存されていることに気付くでしょう。つまり、基本ストリームデータとは別になります。このデータの保存と送信はファイルコンテナの仕事であり、このドキュメントの範囲を超えています。開始コードを使用していなくても、エミュレーション防止バイトが挿入されていることに注意してください。

さらに、と呼ばれる新しい変数がありますNALULengthSizeMinusOne。この紛らわしい名前の変数は、各NALUの長さを格納するために使用するバイト数を示しています。したがって、NALULengthSizeMinusOneが0に設定されている場合、各NALUの前には、その長さを示す1バイトが付きます。サイズを格納するために1バイトを使用すると、NALUの最大サイズは255バイトです。それは明らかにかなり小さいです。キーフレーム全体に対して小さすぎます。2バイトを使用すると、NALUごとに64kが得られます。この例では機能しますが、それでもかなり低い制限です。3バイトは完璧ですが、何らかの理由で普遍的にサポートされていません。したがって、4バイトが断然最も一般的であり、ここで使用したものです。

0x0000 | 00 00 02 41 65 88 81 00 05 4E 7F 87 DF 61 A5 8B
0x0010 | 95 EE A4 E9 38 B7 6A 30 6A 71 B9 55 60 0B 76 2E
0x0020 | B5 0E E4 80 59 27 B8 67 A9 63 37 5E 82 20 55 FB
0x0030 | E4 6A E9 37 35 72 E2 22 91 9E 4D FF 60 86 CE 7E
0x0040 | 42 B7 95 CE 2A E1 26 BE 87 73 84 26 BA 16 36 F4
0x0050 | E6 9F 17 DA D8 64 75 54 B1 F3 45 0C 0B 3C 74 B3
0x0060 | 9D BC EB 53 73 87 C3 0E 62 47 48 62 CA 59 EB 86
0x0070 | 3F 3A FA 86 B5 BF A8 6D 06 16 50 82 C4 CE 62 9E
0x0080 | 4E E6 4C C7 30 3E DE A1 0B D8 83 0B B6 B8 28 BC
0x0090 | A9 EB 77 43 FC 7A 17 94 85 21 CA 37 6B 30 95 B5
0x00A0 | 46 77 30 60 B7 12 D6 8C C5 54 85 29 D8 69 A9 6F
0x00B0 | 12 4E 71 DF E3 E2 B1 6B 6B BF 9F FB 2E 57 30 A9
0x00C0 | 69 76 C4 46 A2 DF FA 91 D9 50 74 55 1D 49 04 5A
0x00D0 | 1C D6 86 68 7C B6 61 48 6C 96 E6 12 4C 27 AD BA
0x00E0 | C7 51 99 8E D0 F0 ED 8E F6 65 79 79 A6 12 A1 95
0x00F0 | DB C8 AE E3 B6 35 E6 8D BC 48 A3 7F AF 4A 28 8A
0x0100 | 53 E2 7E 68 08 9F 67 77 98 52 DB 50 84 D6 5E 25
0x0110 | E1 4A 99 58 34 C7 11 D6 43 FF C4 FD 9A 44 16 D1
0x0120 | B2 FB 02 DB A1 89 69 34 C2 32 55 98 F9 9B B2 31
0x0130 | 3F 49 59 0C 06 8C DB A5 B2 9D 7E 12 2F D0 87 94
0x0140 | 44 E4 0A 76 EF 99 2D 91 18 39 50 3B 29 3B F5 2C
0x0150 | 97 73 48 91 83 B0 A6 F3 4B 70 2F 1C 8F 3B 78 23
0x0160 | C6 AA 86 46 43 1D D7 2A 23 5E 2C D9 48 0A F5 F5
0x0170 | 2C D1 FB 3F F0 4B 78 37 E9 45 DD 72 CF 80 35 C3
0x0180 | 95 07 F3 D9 06 E5 4A 58 76 03 6C 81 20 62 45 65
0x0190 | 44 73 BC FE C1 9F 31 E5 DB 89 5C 6B 79 D8 68 90
0x01A0 | D7 26 A8 A1 88 86 81 DC 9A 4F 40 A5 23 C7 DE BE
0x01B0 | 6F 76 AB 79 16 51 21 67 83 2E F3 D6 27 1A 42 C2
0x01C0 | 94 D1 5D 6C DB 4A 7A E2 CB 0B B0 68 0B BE 19 59
0x01D0 | 00 50 FC C0 BD 9D F5 F5 F8 A8 17 19 D6 B3 E9 74
0x01E0 | BA 50 E5 2C 45 7B F9 93 EA 5A F9 A9 30 B1 6F 5B
0x01F0 | 36 24 1E 8D 55 57 F4 CC 67 B2 65 6A A9 36 26 D0
0x0200 | 06 B8 E2 E3 73 8B D1 C0 1C 52 15 CA B5 AC 60 3E
0x0210 | 36 42 F1 2C BD 99 77 AB A8 A9 A4 8E 9C 8B 84 DE
0x0220 | 73 F0 91 29 97 AE DB AF D6 F8 5E 9B 86 B3 B3 03
0x0230 | B3 AC 75 6F A6 11 69 2F 3D 3A CE FA 53 86 60 95
0x0240 | 6C BB C5 4E F3

この形式の利点は、開始時にデコーダーを構成し、ストリームの途中にジャンプできることです。これは、メディアがハードドライブなどのランダムアクセスメディアで利用できる一般的な使用例であるため、MP4やMKVなどの一般的なコンテナ形式で使用されます。


3
ありがとう、それは本当に私を助けてくれました!記事に入力ミスがありましたが...私は思います;)VCLを「VLC」と呼ぶことがありますが、VLCを「可変長コーディング」と知っているため、かなり混乱する可能性があります。しかし、それでも、あなたの記事は私のためにいくつかのことをクリアしました、良い仕事です!そして...申し訳ありませんが、私はあなたに賛成できません、私はここで新しく、ここにある種の新しいフィルターがあります;)
bananenbär2014

6
ええ、タイプミスについて申し訳ありません。私は少し失読症で、非常に貧しいタイピストです。あなたは正しいです。VLCはこのテキストにはありません。
szatmary 2014

2
素晴らしい要約です!これは本当に私を助けました。2番目(AVCC)のバイトセットをよく見ると明らかですが、NALUデータの前にある4バイトの長さの値はビッグエンディアン形式であることを指摘する価値があると思います。長さの値をバイトスワップする必要があることに気付くまで、iOSでストリームをデコードすることができませんでした。
2014

1
どうもありがとう、男!ところで、Windows Media Foundationh264デコーダーは「AnnexB」サンプルのみを必要とします。幸い、AnnexBとAVCCの間でそれらを変換するのは非常に簡単です。
間もなく2015年

2
AVCCエクストラデータの例のオフセット0x0022に欠落しているゼロバイトはありますか?フォーマットの説明には、PPSサイズ用の16ビットフィールドがあると書かれているので、これ0x00 0x07は単なる0x07。ではなく、そうすべきだと思います。
rhashimoto 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.