1. 株式会社PALTEK
  2. TECHブログ
  3. 技術情報
  4. 2K放送:今更のMPEG2-TSの基本【第二回】

TECHブログ

2K放送:今更のMPEG2-TSの基本【第二回】

2K放送:今更のMPEG2-TSの基本【第二回】

このブログでは、「MPEG2-TS」の基本的なことについてお伝えしてまいります。
「2K放送:今更のMPEG2-TSの基本【第一回】」のブログはこちらからご覧ください。

目次

放送TS(MPEG2-TS)を覗く:後編

前回の続きです。
話を戻して、まずは、188バイト単位のパケットになっている放送TSのPIDを見てみましょう。放送TSで使用するMPEG2-TSの仕様はISO-13818-1に記載されています。
図 1 MPEG2-TSの構成では、今回覗き見る部分以外は省略しています。

図 1 :MPEG2-TSの構成


図 2:MPEG2-TSの概念図

放送TSは、188バイト単位のパケットになっています。図 2の映像1や音声1のコンポーネント(ストリーム)もこのパケット単位に分割され、各パケットにはそのパケットが何者であるかを判別できるようにコンポーネントごとにPIDというものが割り当てられます。映像や音声などのコンポーネントのPIDは固定値ではなく、番組ごとに切りかわったり、場合によっては番組の途中で変わる(昔、一部で話題になったわかさトラップのような)こともあります。そのように変化するPIDをどうやって知るかというと、PMTというパケットに書かれています。

PMTにはサービスごとのストリーム(正確にはコンポーネントと呼びます)の全情報が書かれています。PMTのPIDも固定値ではなく、PATというパケットに書かれています。TR-B10に「PMTによる間接指定」と書かれているのがこのことになります。

PATのPMTは0x00固定となっています。これはTR-B10の随所でPATのPIDは「0x0000」と書かれていることにあたります。
芋づる式で面倒ですが、各パケットとPIDの関連を単純化して図にすると3のようになります。

※画像クリックで大きな画像が表示されます。

図 3:PIDの関係

早速データを見てみましょう。まずは dump_pid.c を使って放送TSの全MPEG2-TSパケットのPIDを見てみます。

> gcc -Wall dump_pid.c -o dump_pid
> ./dump_pid [MPEG2-TSファイル]| less
:
0202(0x9458): 0x0111
0203(0x9514): 0x0121
0204(0x95d0): 0x0111
0205(0x968c): 0x0000  PAT
0206(0x9748): 0x0121
0207(0x9804): 0x0111
0208(0x98c0): 0x0121
:
1938(0x58f38): 0x0111
1939(0x58ff4): 0x0121
1940(0x590b0): 0x0111
1941(0x5916c): 0x0000  PAT
1942(0x59228): 0x0121
1943(0x592e4): 0x0111
1944(0x593a0): 0x0121
:


先頭の数字はファイル先頭からのパケットの数で、カッコ内はファイル内のアドレス(バイト位置)です。「:」の右がPIDです。PATのPIDは0x0000ということが分かっているので該当するPIDには「PAT」と表示するようにしています。205パケット目(ファイル先頭から0x968cバイト目)と1941パケット目に見つかりました。その後も定期的に出てきます。PATの送出周期はTR-B14(地デジ)、TR-B15(BS/CS)に記載されています。この周期で出現しているのでしょう。

PATを覗く

PATの構成はSTB-B10、運用規定はTR-B14(地デジ)、TR-B15(BS/CS)に記載されています。
図 4にPATが入っているMPEG2-TSパケットの構成を示します。例によって覗き見に必要ない部分は省略しています。

※画像クリックで大きな画像が表示されます。

図 4:PAT


先程のdump_pid.cにPATの中身を表示するコードを追加した dump_pat.cで中身を見てみましょう。

> gcc -g -Wall dump_pat.c -o dump_pat
> ./dump_pat 202.ts | less
:
0205(0x968c): 0x0000  PAT
    PAT_section_length : 21
    program_number:0x0000(000), program_map_PID(PMT):0x0010
    program_number:0x00c9(201), program_map_PID(PMT):0x0110
    program_number:0x00ca(202), program_map_PID(PMT):0x0120
    program_number:0x1258(4696), program_map_PID(PMT):0x07d4
:


最初に見つかったPATの中身をみてみます。
PMTが4つ入っています。program_numberがサービスに相当し、この値がservive_idになります(このことはTR-B13の用語定義のprogram_numberの説明に「放送番組番号識別。service_id に等しい。」と記載されています)。service_idが201と202の2つが図 5の番組表に出ている右端の2チャンネルに相当するので、この2つに注目します。201のPMTが0x0110、202のPMTが0x0120となっています。

図5:チャンネルとサービス

PMTを覗く

PMTの構成もPAT同様にSTB-B10、運用規定はTR-B14(地デジ)、TR-B15(BS/CS)に記載されています。後で出てくるストリーム形式識別(stream_type)の定義もPMTの運用規定の箇所に書かれています。
図 6にPMTが入っているMPEG2-TSパケットの構成を示します。例によって覗き見に必要のない部分は省略しています。

※画像クリックで大きな画像が表示されます。

図 6:PMT


先程のdump_pat.cにPMTの中身を表示するコードを追加した dump_pat_pmt.cで中身を見てみましょう。

※PMTは複数のパケットにまたがることがありますが、簡略化のため、コードは1パケットに収まっていることを前提としています。


> gcc -g -Wall dump_pat_pmt.c -o dump_pat_pmt
> ./dump_pat_pmt 202.ts | less
:
0483(0x162b4): 0x0110  PMT(0x0110)
    PMT_section_length:0x0033(51), PMT_program_info_length:0x0006(6)
      stream_type:0x02:MPEG2 VIDEO
        elementary_PID:0x0111
        ES_info_length:0x0006
      stream_type:0x0f:MPEG2 AAC
        elementary_PID:0x0112
        ES_info_length:0x0003
      stream_type:0x06:字幕・文字スーパー
        elementary_PID:0x0116
        ES_info_length:0x0008
:
1629(0x4ac4c): 0x0120  PMT(0x0120)
    PMT_section_length:0x0033(51), PMT_program_info_length:0x0006(6)
      stream_type:0x02:MPEG2 VIDEO
        elementary_PID:0x0121
        ES_info_length:0x0006
      stream_type:0x0f:MPEG2 AAC
        elementary_PID:0x0122
        ES_info_length:0x0003
      stream_type:0x06:字幕・文字スーパー
        elementary_PID:0x0126
        ES_info_length:0x0008
:

サービスID 201のPMTが0x0110、202のPMTが0x0120だったので、この2つを見てみます。どちらも映像(MPEG2 VIDEO)、音声(AAC)、字幕の3つのコンポーネントを持っていることが分かります。エレメンタリーPID(elementary_PID)が各コンポーネントのPIDなので、このPIDのパケットに映像、音声、字幕のデータが入っていることが分かります。


次回は、このPIDを使って映像や音声等ストリームを取り出します。


今回説明した内容などでのご質問がありましたら、下記よりお問い合わせください。

お問い合わせはこちら