/dev/null に消える前に…

記憶から消える前に備忘録。

MPEG-2 TS について Part 1

MPEG-2 TS について.


参考資料・サイト

MPEG-2 TS について(メイン)

MPEG-2 について

MPEG-2 とは

MPEG-2 はテレビ放送を中心に幅広く使用されているシステムや映像・音声・その他の情報についての規格のことである.

MPEG-2 の規格に沿って映像・音声などを多重化する方法の定義する規格を MPEG-2 システムといい,MPEG-2 システムは用途別に「MPEG-2 TS」と「MPEG-2 PS」に分類される.

  • MPEG-2 TS(今回のメインテーマ)
    MPEG-2 TS の TS はトランスポートストリーム (Transport Stream) の略である.
    複数のプログラム,つまり,多数の映像と音声の組をエラーの可能性がある環境(放送や通信)で取り扱うことを想定した形式であり,例えば日本の地上・BSデジタル放送や世界各国のデジタル放送規格で多く使用されている.

  • MPEG-2 PS
    MPEG-2 PS の PS はプログラムストリーム (Program Stream) の略である.
    単一のプログラム,つまり,一組の映像と音声をエラーの可能性が低い環境(光ディスクや蓄積メディアなど)で取り扱うことを想定した形式であり,例えばDVDで使用されている.

ja.wikipedia.org

MPEG-2 TS の構造

MPEG-2 TS ではすべてのデータを 188 Byte の固定長パケットに分割する.

188 Byte の固定長パケットの先頭 4 Byte にタイムスタンプ情報を付加した 192 Byte や順方向誤り訂正 (FEC: Forward Error Correction)のための 16 Byte を(おそらく末尾?に)付加した 204 Byte をひとかたまりにする場合もある.

MPEG-2 TS に含まれるデータを以下に大きく分類する.

  • ES (Elementary Stream)
    映像・音声などの符号化されたデータをエレメンタリストリーム (ES: Elementary Stream) という. ES を大まかに(たいていは意味のある)かたまりで分割してパケット化したものを PES (Packetized Elementary Stream) といい,さらに MPEG-2 TS の複数のパケットに分割して伝送する.

  • PSI (Program Specific Information)
    MPEG-2 TS では複数のプログラムを扱うことができるが,映像・音声などの ES の正しい組み合わせを与えるためには複数ある ES がそれぞれ何者であるのか,どのプログラムと対応するのかを知る必要がある. PSI (Program Specific Information) は ES の種類やプログラムとの対応関係を与える.

  • SI (Service Information)
    テレビ放送などではプログラム(番組)の制御・属性などの情報である SI (Service Information) が送出されている. これをもとに番組表を構築したりできる.

(ES をパケット分割したものは PES だが, SI をパケット分割したものは PSI というわけではないので少々ややこしい.)

基本的な MPEG-2 TS の構造のイメージを以下に載せておく(図1).

MPEG-2 TS の構造のイメージ
図1. MPEG-2 TS の構造のイメージ.

TS ヘッダには PID (Packet IDentifier) と呼ばれるパケット識別子が含まれており,各パケットに含まれる ES, PSI, SI の種類がわかるようになっている.

MPEG-2 TS パケットの構造

MPEG-2 TS パケットは大まかにヘッダ,アダプテーションフィールド,ペイロードの3つのフィールドで構成されている.

3つのフィールドで固定長 188 Byte のパケットを構成することになるが,「意味のある」データだけでちょうど 188 Byte にならないことはよくある. そこで, 188 Byte に対して足りない分はスタッフィング(詰め物),つまり「意味のない」データ(MPEG-2 TS では16進数 0xFF)を詰める.

スタッフィングはアダプテーションフィールドまたはペイロードの末尾に挿入することができる(図2). (http://www.jushin-s.co.jp/michi/download/97_t43.pdfを参照するとよい.)

スタッフィングの挿入方法
図2. スタッフィングの挿入方法.

また,分割される前の意味のあるデータのかたまりをセクションと呼び,セクションは図3のようにパケットのサイズに合わせて分割される.

セクションの分割
図3. セクションの分割.

ここで,セクション1の末尾データが入るパケットはスタッフィングで埋めること(図4上段)もあれば,セクション1の末尾データに続いてセクション2を同じパケットに入れること(図4下段)もできる. (なお,図4ではペイロード末尾にスタッフィングを挿入しているが,上述の通り,アダプテーションフィールド末尾に挿入しても構わない.)

パケットへのセクションの挿入方法
図4. パケットへのセクションの挿入方法.

このような構造を実現するためにセクションの先頭データが含まれるパケットのペイロードの先頭 1 Byte 目にはポインタフィールドと呼ばれる新しく始まるセクションの開始位置を表す情報が挿入される.

パケット内に1つのセクションだけが入る場合にはセクションはポインタフィールドの直後から始まるのでポインタフィールドは 0x00 となる. (つまり図4上段のパケットと図4下段の1つ目のパケットのポインタフィールドは 0x00 である.)

図4下段の2つ目のパケットのように2つのセクションが存在する場合,例えば,セクション1の末尾データが 25 Byte 分あれば,セクション2の開始位置はポインタフィールドの直後から数えて 25 Byte 先なので,ポインタフィールドは 0x19 (10進数に直すと 25)である.

www.jushin-s.co.jp


次回記事

長くなってしまったので続きは次回記事に記そうと思う.