Skip to content
uupaa edited this page Sep 12, 2018 · 2 revisions

このエントリでは、 ITU-T H.264 の Annex B にある ByteStream について説明します。

ByteStream, NAL file format

ByteStream は 00 00 01 ... から始まるバイト列を1区切りとしています。この 00 00 01 をスタートコードと呼びます。

スタートコードの前に複数の余計な 00 が存在する場合もありますが、これらも正常なデータです。00 は適切に読み飛ばす必要があります。

00 00 00 00 00 01 nn nn といったバイト列は余計な00を読み飛ばし、00 00 01 nn nn として解釈する必要があります

MPEG-2 TS から取得できるバイナリデータは Byte stream format

MPEG-2 TS から取得できるバイナリデータは ByteStream format です

ByteStream 化された NALUnit は以下のようになっており、 スタートコードから次のスタートコードまでが1つのNALUnitに相当します。

+---------------+----------++---------------+----------+------
| 00 00 01      | NAL Unit || 00 00 01      | NAL Unit | ...
+---------------+----------++---------------+----------+------

MPEG4ByteStream.convertByteStreamToNALUnitObjectArray の引数 stream に指定できるデータはこのフォーマットです。

MP4 が要求するバイナリデータは NAL file foramt

MP4 に埋め込んで使用するバイナリデータは NAL file format (H.264 Raw Stream) です。 それぞれの NALUnit の前に 4byte の NALUnitSize が存在します

+--------------------+----------++--------------------+----------+------
| NALUnitSize(4byte) | NAL Unit || NALUnitSize(4byte) | NAL Unit | ...
+--------------------+----------++--------------------+----------+------

ffmpeg で 拡張子を.264 にすると、H.264 Raw Stream を出力できます。

ffmpeg が生成する H.264 Raw Stream には AUD, SPS, PPS は含まれず、IDR などのピクチャ情報と SEI のみが含まれます。

SPS と PPS は、MPEG-4 part 15 AVCDecoderConfigurationRecord に格納されます。

aligned(8) class AVCDecoderConfigurationRecord {
    unsigned int(8) configurationVersion = 1;
    unsigned int(8) AVCProfileIndication;
    unsigned int(8) profile_compatibility;
    unsigned int(8) AVCLevelIndication;
    bit(6) reserved = ‘111111’b;
    unsigned int(2) lengthSizeMinusOne;
    bit(3) reserved = ‘111’b;
    unsigned int(5) numOfSequenceParameterSets;
    for (i=0; i< numOfSequenceParameterSets; i++) {
        unsigned int(16) sequenceParameterSetLength ;
        bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit;
    }
    unsigned int(8) numOfPictureParameterSets;
    for (i=0; i< numOfPictureParameterSets; i++) {
        unsigned int(16) pictureParameterSetLength;
        bit(8*pictureParameterSetLength) pictureParameterSetNALUnit;
    }
}

Eaxmple

ADDR    0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
------ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ---- ASCII ----- --- RULE ---
000000 00 00 00 01 09 f0 00 00 00 01 67 64 00 0a ac b8 ..........gd....
       ~~~~~~~~~~~ ~~~~~                                                    AUD
                         ~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~                      SPS
000010 40 8d 08 00 00 03 00 08 00 00 03 00 10 20 00 00 @............ ..
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                            SPS
                                                 ~~~~~
000020 00 01 68 ee 0f 2c 8b 00 00 01 06 05 ff ff 5b dc ..h..,........[.
       ~~~~~ ~~~~~~~~~~~~~~                                                 PPS
                            ~~~~~~~~ ~~~~~~~~~~~~~~~~~                      SEI
   :
   :
000280 3d 31 3a 31 2e 30 30 00 80 00 00 01 65 88 84 37 =1:1.00.....e..7
       ~~~~~~~~~~~~~~~~~~~~~~~~~~                                           SEI
                                  ~~~~~~~~ ~~~~~~~~~~~                      IDR
000290 7c ff ff e1 16 c4 4a e9 16 66 9e 80 a8 3f ad eb |.....J..f...?..
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002a0 19 17 6f 2e ed 71 93 90 da 5f b0 f2 00 33 18 d4 ..o..q..._...3..
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002b0 b1 56 27 f9 e4 fb a4 ae fa 52 0a 8e 05 e4 e4 ae .V'......R......
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002c0 07 a8 ee 0e 0e 77 f3 e2 03 5d 00 ee 2a 25 31 0a .....w...]..*%1.
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002d0 ff 9d 5e af 17 01 66 1e 2c 9b 30 00 24 c0 65 95 ..^...f.,.0.$.e.
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002e0 29 37 33 7e 9c 46 ab c7 71 aa 90 f0 7d 2a 20 db )73~.F..q...}* .
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002f0 fb 9a 31 ba bc e7 15 0c 11 96 98 9f df a2 06 bf ..1.............
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
000300 71 af b9 ac a9 61 00 00 00 01 09 f0 00 00 00 01 q....a..........
       ~~~~~~~~~~~~~~~~~                                                    IDR
                         ~~~~~~~~~~~ ~~~~~                                  AUD
                                           ~~~~~~~~~~~                      SPS