Example - uupaa/H264.js GitHub Wiki
このエントリは未精査の状態です。参考程度にみてください。
MPEG2-TS AVC
H264 + AAC データを内包する、MPEG-2 TS パケットの例です。
先頭のパケット
先頭のパケット。PAT です。PMT の PID を示す情報を含んでいます。
ADRESS 0 1 2 3 4 5 6 7 8 9 A B C D E F
------ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
000000 47 40 00 10 00 00 b0 0d 00 01 c1 00 00 00 01 ef
000010 ff 36 90 e2 3d ff ff ff ff ff ff ff ff ff ff ff
000020 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
000030 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
000040 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
000050 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
000060 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
000070 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
000080 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
000090 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0000a0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0000b0 ff ff ff ff ff ff ff ff ff ff ff ff
このパケットの先頭部分、特に先頭の4byte(47 40 00 10)を見てみましょう。
ADRESS 0 1 2 3 4 5 6 7 8 9 A B C D E F
------ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
000000 47 40 00 10 00 00 b0 0d 00 01 c1 00 00 00 01 ef
000010 ff 36 90 e2 3d ff ff ff ff ff ff ff ff ff ff ff
このバイト列の詳細は、 T-REC-H.222.0 の P.19 に記述があります。
この中で重要なのは、sync_byte, payload_unit_start_indicator, PID, adaptation_field_control, continuity_counter になります。
T-REC-H.222.0 (P.19) - Table 2-2 Transport packet of this Recommendation | International Standard
|00000000|12344444|44444444|55667777| bits ~~~~~~~~ -> 8 sync_byte `0x47` ~ -> 1 transport_error_indicator ~ -> 1 payload_unit_start_indicator ~ -> 1 transport_priority ~~~~~ ~~~~~~~~ -> 13 PID ~~ -> 2 transport_scrambling_control ~~ -> 2 adaptation_field_control ~~~~ -> 4 continuity_counter
- このパケットは PAT と呼ばれます。
- 先頭の1byteは sync_byte です。この値は常に 0x47 になります。
- MPEG-2 TS における PID は、コンテキスト依存のキーワードです。注意深くそれが何を示すものか確認する必要があります。
- PAT の PID は常に 0x0000 です。
- payload_unit_start_indicator はパケットの種類と搭載しているペイロードの中身により 0 または 1 になります。
このフラグは2つのシーンで異なる解釈がされます。かなり初心者殺しです。
- パケットが PAT or PMT の場合で 1 なら payload の前に 1byte の pointer_field が挿入されています。 payload を読み込む前に 1byte を読み飛ばす必要があります
- パケットがPAT or PMT 以外で、フラグが 1 ならそのパケットには PES の先頭が含まれます。
47 40 00 10
は、以下のように分解できます。
- sync_byte = 0x47
- transport_error_indicator = 0
- payload_unit_start_indicator = 1
- transport_priority = 0
- PID = 0x0000
- transport_scrambling_control = 0
- adaptation_field_control = 1
- continuity_counter = 0
payload_unit_start_indicator が 1 で PAT なため、payload の前に pointer_field が挿入されている状態です。
ADRESS 0 1 2 3 4 5 6 7 8 9 A B C D E F
------ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
000000 47 40 00 10 00 00 b0 0d 00 01 c1 00 00 00 01 ef
~~~~~~~~~~~ -> Packet Header
~~ -> pointer_field
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~... -> Packet Payload
00 b0 0d 00 01...
は PAT のペイロード です。
この部分の詳細は T-REC-H.222.0 (P.43) - 2.4.4.3 Program Association Table に記述があります。
- CRC_32 は ペイロードの先頭から末尾 - 4byte の CRC32 の値です。
- pointer_field や CRC_32 の格納されている部分は除外して計算します
2番目のパケット
2番目のパケットは、PMT です。動画と音声の ES_PID(VIDEO_STREAM_PID, AUDIO_STREAM_PID) が格納されています。
TODO: 後で書く
ADRESS 0 1 2 3 4 5 6 7 8 9 A B C D E F
------ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
0000bc 47 4f ff 10 00 02 b0 3c 00 01 c1 00 00 e1 00 f0
0000cc 11 25 0f ff ff 49 44 33 20 ff 49 44 33 20 00 1f
0000dc 00 01 15 e1 02 f0 0f 26 0d ff ff 49 44 33 20 ff
0000ec 49 44 33 20 00 0f 1b e1 00 f0 00 0f e1 01 f0 00
0000fc d2 7f 16 89 ff ff ff ff ff ff ff ff ff ff ff ff
00010c ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00011c ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00012c ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00013c ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00014c ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00015c ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00016c ff ff ff ff ff ff ff ff ff ff ff ff