MPEG-TS
映像・音声・表を、1 本のストリームに混ぜる 188 バイトのパケット。
PAT を運ぶ TS パケット
4 バイトのヘッダと、実際に CRC を計算した目次の表。
0:00
フレーム全体
4 バイトのヘッダ(同期・フラグ・PID・カウンタ)に続いてペイロード。ここでは目次の表です。188 バイトの残りは 0xFF の詰め物です。
| フィールド | 位置 | 例の値 | 意味 |
|---|---|---|---|
| 同期バイト | 0 バイト目 | 0x47 | 常に 0x47('G')。TS パケットはちょうど 188 バイトなので、受信側は 188 バイトごとに 0x47 が現れるかを確かめてパケットの境目を見つけます。乱れのあとの復帰もこれで行います。 |
| 転送エラー | 1 バイト目の bit 7 | 0 | 誤り訂正できなかった復調器が立てます。デコーダはこのパケットを読み飛ばします。 |
| ペイロード開始 | 1 バイト目の bit 6 | 1 | 1 = このペイロードの中で、新しい PES パケットやテーブルのセクションが始まります(テーブルの場合、最初の 1 バイトは pointer_field)。フレームやテーブルの始まりの目印です。 |
| 転送優先度 | 1 バイト目の bit 5 | 0 | 1 = 同じ PID の他のパケットより重要。ほぼ使われません。 |
| PID | 1–2 バイト目にまたがる | 0x0000 = PAT | Packet Identifier。このパケットがどのストリームのものか。1 本の TS に映像・複数の音声・字幕・テーブルが混ざっていて、PID だけで区別します。PID 0 は常に PAT(目次の表)です。 |
| スクランブル | 3 バイト目の bits 7–6 | 00 | 有料放送の暗号化の印。00 = スクランブルなし。 |
| アダプテーションフィールド | 3 バイト目の bits 5–4 | 01 = payload only | 01 = ペイロードのみ、10 = アダプテーションフィールドのみ、11 = 両方。アダプテーションフィールドは PCR クロックやスタッフィングを運びます。 |
| 連続カウンタ | 3 バイト目の bits 3–0 | 0 | PID ごとに 0〜15 を、ペイロード付きパケットで +1 しながら数えます。数が飛べば、その PID のパケットが失われたと分かります。 |
| ポインタフィールド | 4 バイト目 | 0 | テーブルで PUSI = 1 のときだけ存在します。セクションの始まりまでに読み飛ばすバイト数。0 = すぐ。 |
| テーブル ID | 5 バイト目 | 0x00 = PAT | 0x00 = PAT(Program Association Table)、0x02 = PMT、0x42 = SDT など。 |
| シンタックス指示 | 6 バイト目の bit 7 | 1 | 1 = CRC 付きの長いセクション形式。 |
| ゼロ | 6 バイト目の bit 6 | 0 | PSI テーブルでは常に 0。 |
| 予約 | 6 バイト目の bits 5–4 | 11 | 1 1 に設定。 |
| セクション長 | 6–7 バイト目にまたがる | 13 | このフィールドの後ろから CRC の終わりまでのバイト数。5(固定部)+ 4(番組 1 つ)+ 4(CRC)= 13。 |
| トランスポートストリーム ID | 8–9 バイト目 | 1 | この多重化ストリーム全体の ID。 |
| 予約 | 10 バイト目の bits 7–6 | 11 | 1 1 に設定。 |
| バージョン | 10 バイト目の bits 5–1 | 0 | 内容が変わるたびに増えます。受信側は再読み込みの合図にします。 |
| 現行/次 | 10 バイト目の bit 0 | 1 | 1 = この表がいま有効なもの。 |
| セクション番号 | 11 バイト目 | 0 | 複数のセクションに分かれた表の、何番目か。 |
| 最終セクション番号 | 12 バイト目 | 0 | 最後のセクションの番号。0 = 表が 1 セクションに収まっている。 |
| 番組番号 | 13–14 バイト目 | 1 | 番組(映像 + 音声のひとまとまり)。ここでは 1 番。 |
| 予約 | 15 バイト目の bits 7–5 | 111 | 1 1 1 に設定。 |
| PMT の PID | 15–16 バイト目にまたがる | 0x1000 | 番組 1 の Program Map Table がどこにあるか。この PID のパケットです。PMT が映像・音声ストリームの PID を一覧にしています。デコードは PID 0 → PMT の PID → 映像の PID の順にたどって始まります。 |
| CRC-32 | 17–20 バイト目 | 0x2AB104B2 | セクション全体に対する CRC-32/MPEG-2(多項式 0x04C11DB7、初期値 0xFFFFFFFF、反射なし)。ここでは実際に計算した 0x2AB104B2 です。CRC が合わない表は受信側が捨てます。 |
概要
MPEG トランスポートストリーム(TS)は、損失のある回線での放送のために作られました。すべてを 188 バイト固定のパケットに切り、各パケットを 0x47 で始めて PID で札を付けます。映像、複数の音声、字幕、それらを説明する表が 1 本に混ざって流れ、受信側はいつでも途中から参加できます。
表(PAT、PMT)が、どの PID が映像・音声かをデコーダに教えます。メディア本体はタイムスタンプ付きの PES パケットに包まれ、TS パケットに分割されます。デジタルテレビ、Blu-ray、IPTV、HLS のセグメントがこれを使っています。
基本情報
- パケット長
- 188 バイト(誤り訂正付きで 204)
- ヘッダ
- 4 バイト、同期 0x47
- PID
- 13 ビット(8,192 本)
- クロック
- PCR 27 MHz, PTS 90 kHz
- 表
- PAT, PMT, SDT, ... + CRC-32
- 規格
- ISO/IEC 13818-1
PES パケットの中の映像フレーム
表示時刻を持つ PES ヘッダと、そのあとに続く H.264 データの先頭。
0:00
フレーム全体
圧縮されたフレームの前に PES ヘッダが付き、再生側に最も必要な「表示時刻」を運びます。PES パケットは 184 バイトずつに切られ、TS パケットに包まれます。
| フィールド | 位置 | 例の値 | 意味 |
|---|---|---|---|
| スタートコードプレフィックス | 0–2 バイト目 | 00 00 01 | 00 00 01 は、正しくエスケープされた映像データの中には現れないので、デコーダはこれを探して PES パケットの先頭を見つけられます。 |
| ストリーム ID | 3 バイト目 | 0xE0 = video stream 0 | エレメンタリストリームの種類。0xE0〜0xEF が映像、0xC0〜0xDF が音声。 |
| PES パケット長 | 4–5 バイト目 | 0 (unbounded) | 後ろに続くバイト数。映像では 0 が許され、「無制限」の意味です。次のパケットが始まるところが終わり(1 フレームが 65,535 バイトを超えることが多いため)。 |
| マーカー | 6 バイト目の bits 7–6 | 10 | 常に 10。 |
| PES フラグ | 6 バイト目の bits 5–0 | 000000 | スクランブル(2 ビット)、優先度、データアラインメント、著作権、オリジナル。いずれも 0 です。 |
| PTS/DTS フラグ | 7 バイト目の bits 7–6 | 10 = PTS only | 10 = PTS のみあり、11 = 両方あり、00 = なし。順番どおりのフレームは PTS だけでよく、B フレームがあると復号順と表示順が違うので DTS も要ります。 |
| その他のフラグ | 7 バイト目の bits 5–0 | 000000 | ESCR、ES レート、トリックモード、コピー情報、CRC、拡張。いずれもなし。 |
| ヘッダデータ長 | 8 バイト目 | 5 | ペイロードの前にある任意ヘッダのバイト数。5 バイトの PTS だけです。 |
| PTS | 9–13 バイト目 | 90000 = 1.000 s | Presentation Time Stamp。このフレームをいつ表示するか。90 kHz の刻みで 33 ビット幅、5 バイトに分けて、各グループの後にマーカービットが入ります。ここでは 90000 刻み = 1.000 秒。33 ビットの 90 kHz は約 26.5 時間で一周します。 |
| H.264 スタートコード | 14–17 バイト目 | 00 00 00 01 | ここから圧縮映像が始まります。H.264 のバイトストリームでは、NAL ユニットごとに 00 00 00 01 で始まります。 |
| NAL ヘッダ | 18 バイト目 | 0x09 = AUD | forbidden_zero 0、nal_ref_idc 0、種別 9 = Access Unit Delimiter(「新しいフレームの始まり」)。 |
| AUD データ | 19 バイト目 | 0xF0 | primary_pic_type 7(どのスライス種別でもよい)と rbsp ストップビット。 |
使われる場面
- デジタルテレビ放送(DVB、ATSC、ISDB)
- IPTV や素材伝送。UDP や SRT で運ぶことが多い(TS 7 個 = 1,316 バイトで 1 データグラム)
- HLS のセグメント(.ts ファイル)、Blu-ray(M2TS)
つまずきやすい点
- 小さなストリームではオーバーヘッドが大きくなります。188 バイトごとに 4 バイトのヘッダとスタッフィング。
- 連続カウンタの飛びで損失を検出しますが、1 回だけ許される正規の重複でも反応します。
- PTS は約 26.5 時間で一周します。長時間の録画では、折り返しへの対応が必要です。
出典・規格
- ISO/IEC 13818-1 (MPEG-2 Systems)
- ITU-T H.264 Annex B