Baud
プロトコル一覧

MPEG-TS

映像・音声・表を、1 本のストリームに混ぜる 188 バイトのパケット。

PAT を運ぶ TS パケット

4 バイトのヘッダと、実際に CRC を計算した目次の表。

PAT を運ぶ MPEG-TS パケット・188 バイトのうち先頭 21このあと 188 バイトまで 0xFF で埋める0816470100011140010000000000000000100001000000000000000000000000B0101100000D0000110100000000000100000001C1110000010000000000000000000000000000000100000001F01111000000000000002A00101010B1101100010400000100B210110010同期バイトPID連続…ポインタフ…テーブル IDセクション長トランスポートストリー…バー…セクション…最終セクシ…番組番号予…PMT …CRC-32フィールドをクリックして中身を見る

フレーム全体

4 バイトのヘッダ(同期・フラグ・PID・カウンタ)に続いてペイロード。ここでは目次の表です。188 バイトの残りは 0xFF の詰め物です。

フィールド位置例の値意味
同期バイト0 バイト目0x47常に 0x47('G')。TS パケットはちょうど 188 バイトなので、受信側は 188 バイトごとに 0x47 が現れるかを確かめてパケットの境目を見つけます。乱れのあとの復帰もこれで行います。
転送エラー1 バイト目の bit 70誤り訂正できなかった復調器が立てます。デコーダはこのパケットを読み飛ばします。
ペイロード開始1 バイト目の bit 611 = このペイロードの中で、新しい PES パケットやテーブルのセクションが始まります(テーブルの場合、最初の 1 バイトは pointer_field)。フレームやテーブルの始まりの目印です。
転送優先度1 バイト目の bit 501 = 同じ PID の他のパケットより重要。ほぼ使われません。
PID1–2 バイト目にまたがる0x0000 = PATPacket Identifier。このパケットがどのストリームのものか。1 本の TS に映像・複数の音声・字幕・テーブルが混ざっていて、PID だけで区別します。PID 0 は常に PAT(目次の表)です。
スクランブル3 バイト目の bits 7–600有料放送の暗号化の印。00 = スクランブルなし。
アダプテーションフィールド3 バイト目の bits 5–401 = payload only01 = ペイロードのみ、10 = アダプテーションフィールドのみ、11 = 両方。アダプテーションフィールドは PCR クロックやスタッフィングを運びます。
連続カウンタ3 バイト目の bits 3–00PID ごとに 0〜15 を、ペイロード付きパケットで +1 しながら数えます。数が飛べば、その PID のパケットが失われたと分かります。
ポインタフィールド4 バイト目0テーブルで PUSI = 1 のときだけ存在します。セクションの始まりまでに読み飛ばすバイト数。0 = すぐ。
テーブル ID5 バイト目0x00 = PAT0x00 = PAT(Program Association Table)、0x02 = PMT、0x42 = SDT など。
シンタックス指示6 バイト目の bit 711 = CRC 付きの長いセクション形式。
ゼロ6 バイト目の bit 60PSI テーブルでは常に 0。
予約6 バイト目の bits 5–4111 1 に設定。
セクション長6–7 バイト目にまたがる13このフィールドの後ろから CRC の終わりまでのバイト数。5(固定部)+ 4(番組 1 つ)+ 4(CRC)= 13。
トランスポートストリーム ID8–9 バイト目1この多重化ストリーム全体の ID。
予約10 バイト目の bits 7–6111 1 に設定。
バージョン10 バイト目の bits 5–10内容が変わるたびに増えます。受信側は再読み込みの合図にします。
現行/次10 バイト目の bit 011 = この表がいま有効なもの。
セクション番号11 バイト目0複数のセクションに分かれた表の、何番目か。
最終セクション番号12 バイト目0最後のセクションの番号。0 = 表が 1 セクションに収まっている。
番組番号13–14 バイト目1番組(映像 + 音声のひとまとまり)。ここでは 1 番。
予約15 バイト目の bits 7–51111 1 1 に設定。
PMT の PID15–16 バイト目にまたがる0x1000番組 1 の Program Map Table がどこにあるか。この PID のパケットです。PMT が映像・音声ストリームの PID を一覧にしています。デコードは PID 0 → PMT の PID → 映像の PID の順にたどって始まります。
CRC-3217–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 データの先頭。

映像フレームの PES ヘッダ・20 バイトスライスのデータが続き、多数の TS パケットに分かれる0816000000000000000000000100000001E01110000000000000000000000000801000000080100000000500000101210010000100000000000500000101BF10111111210010000100000000000000000000000000000001000000010900001001F011110000スタートコードプレフィックスストリーム…PES パケット長PES フ…P…その他…ヘッダデー…PTSH.264 スタートコードNAL ヘッダAUD データフィールドをクリックして中身を見る

フレーム全体

圧縮されたフレームの前に PES ヘッダが付き、再生側に最も必要な「表示時刻」を運びます。PES パケットは 184 バイトずつに切られ、TS パケットに包まれます。

フィールド位置例の値意味
スタートコードプレフィックス0–2 バイト目00 00 0100 00 01 は、正しくエスケープされた映像データの中には現れないので、デコーダはこれを探して PES パケットの先頭を見つけられます。
ストリーム ID3 バイト目0xE0 = video stream 0エレメンタリストリームの種類。0xE0〜0xEF が映像、0xC0〜0xDF が音声。
PES パケット長4–5 バイト目0 (unbounded)後ろに続くバイト数。映像では 0 が許され、「無制限」の意味です。次のパケットが始まるところが終わり(1 フレームが 65,535 バイトを超えることが多いため)。
マーカー6 バイト目の bits 7–610常に 10。
PES フラグ6 バイト目の bits 5–0000000スクランブル(2 ビット)、優先度、データアラインメント、著作権、オリジナル。いずれも 0 です。
PTS/DTS フラグ7 バイト目の bits 7–610 = PTS only10 = PTS のみあり、11 = 両方あり、00 = なし。順番どおりのフレームは PTS だけでよく、B フレームがあると復号順と表示順が違うので DTS も要ります。
その他のフラグ7 バイト目の bits 5–0000000ESCR、ES レート、トリックモード、コピー情報、CRC、拡張。いずれもなし。
ヘッダデータ長8 バイト目5ペイロードの前にある任意ヘッダのバイト数。5 バイトの PTS だけです。
PTS9–13 バイト目90000 = 1.000 sPresentation 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 = AUDforbidden_zero 0、nal_ref_idc 0、種別 9 = Access Unit Delimiter(「新しいフレームの始まり」)。
AUD データ19 バイト目0xF0primary_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

関連するプロトコル