MPEG-2 TS について Part 3
MPEG-2 TS の全体的な話については一応この記事で最後のつもり.
前回記事
参考資料・サイト
MPEG-2 TS について
- 標準規格の入手について(STD-B10)|一般社団法人 電波産業会
一般社団法人電波産業会(ARIB)の規格書.昔は日本語版も無料だったらしいけど,現在は英語版のみ無料.(無料だった頃の日本語版(少し古いかも)が芝◯工大のサーバにミラーされている.) - http://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-1.pdf
MPEG-2に関する規格書.
PSI / SI
今回は MPEG-2 TS パケットのペイロードについて, ES, PSI, SI のうち PSI と SI について記していく.
PSI / SI はプログラム(番組)に関する情報であり,これらをまとめてテーブルと呼ぶ. 主なテーブルの種類についてまとめていこう.
まずは PSI のテーブルについて.
PAT (Program Association Table)
トランスポートストリームに含まれるプログラムと PMT (後述のテーブル)を対応づける役割をもち, PMT の PID が一覧として格納されている. そのほかトランスポートストリームにおける NIT (後述のテーブル) の PID を格納していることもある.
PAT の PID は常に 0x0000 である.CAT (Conditional Access Table)
限定受信(有料放送)についての情報を格納している.
CAT の PID は常に 0x0001 である.PMT (Program Map Table)
PMT に対応するプログラムの映像や音声などの ES (エレメンタリストリーム)の PID を格納している. PMT に格納された ES の PID をもとにトランスポートストリームから ES のパケットを抽出することでプログラムが再生される.
PMT の PID は PAT によって指定される.
続いて SI のテーブルについて.
MPEG-2 システムの規格としては PSI のみ定義されてるが,利便性のために番組情報などを含めたデータとして SI が規定される.
以下の項目は,一般社団法人電波産業会(ARIB)が規定するものをまとめている.
NIT (Network Information Table)
変調周波数など送信するネットワークに関する情報と番組を関連づける.
NIT の PID は常に 0x0010 である. (なお, PAT にも NIT の PID が格納されている.)SDT (Service Description Table)
テレビのチャンネルの名称や,放送事業者の名称などの情報を格納している.
SDT の PID は常に 0x0011 である.EIT (Event Information Table)
番組の名称や放送日時,内容の説明などの情報を格納している. 電子番組表 (EPG: Electronic Programming Guide) は、主に EIT の情報から作成される.
EIT の PID は主に 0x0012 であるが,日本の地上デジタル放送ではそのほかに 0x0026, 0x0027 も用いられる.TOT (Time Offset Table)
現在の日付,時刻の情報のほかにサマータイム実施時のオフセット時間情報が格納されている.
TDT の PID は常に 0x0014 である.TDT (Time and Date Table)
現在の日付,時刻の情報が格納されている.
TDT の PID は常に 0x0014 である.
TDT に含まれるすべての情報は TOT に含まれており,トランスポートストリームには TDT と TOT のどちらか一方のみが送出される. 日本の地上デジタル放送では TDT のみ送出されている.
SI には上記以外にも多くのテーブルが存在するが省略する. (詳しくは 標準規格の入手について(STD-B10)|一般社団法人 電波産業会 の Table 4-1 などを参照してほしい)
MPEG-2 TS について Part 2
前回に引き続き, MPEG-2 TS について.
前回記事
参考資料・サイト
MPEG-2 TS について
- 標準規格の入手について(STD-B10)|一般社団法人 電波産業会
一般社団法人電波産業会(ARIB)の規格書.昔は日本語版も無料だったらしいけど,現在は英語版のみ無料.(無料だった頃の日本語版(少し古いかも)が芝◯工大のサーバにミラーされている.) - http://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-1.pdf
MPEG-2に関する規格書. - 7.3.4 MPEG-2 TS (Transport Stream)パケット - テレビ会議教科書 - テレビ会議教科書
MPEG-2 TS パケットのヘッダ,アダプテーションフィールドの構造についての備忘録に使ったサイト. - http://www.jushin-s.co.jp/michi/download/97_t43.pdf
MPEG-2 TS パケットのペイロードの先頭にあるポインタ・フィールドに関するわかりやすい資料.
MPEG-2 TS パケットのヘッダ,アダプテーションフィールド
MPEG-2 TS のパケットのペイロードにはパケットごとに ES, PSI, SI の様々なデータが含まれており,それぞれデータの種類によって構造が異なるが,ヘッダとアダプテーションフィールドはデータの種類によらず同じ構造をもつ.
そこで,ここではヘッダおよびアダプテーションフィールドの構造について記していく.
ヘッダの構造
http://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-1.pdf の Table 2-2 や 7.3.4 MPEG-2 TS (Transport Stream)パケット - テレビ会議教科書 - テレビ会議教科書 を参照するとよい.
ヘッダは MPEG-2 TS のパケット (188 Byte) のうちの先頭の 4 Byte であり,下図のような構造をしている.
sync byte
MPEG-2 TS パケットの同期をとるための情報. 常に 0x47 であり, 188 Byte (または 192 Byte や 204 Byte)ごとに繰り返される 0x47 をもとにパケットを見つける.transport error indicator
必ず '0' で送信されるが,通信中のエラーなどで '1' になってしまっている場合にはそのパケットに訂正不可能なエラーが存在すると言える.payload unit start indicator
意味のあるデータのかたまり(セクション)を分割してパケット化するが,新しいセクションの先頭データを含む場合に '1' とする. このとき,前回記事に書いたポインタフィールドがペイロードの先頭 1 Byte 目に現れる. 逆にセクションの先頭データを含まない場合は '0' とする.transport priority
'1' が設定されていると,関連パケット(同じ PID のパケット)の '0' に設定されているものよりも高い優先度をもつ. 通信システムの中でデータに優先順位がつけられるらしいが具体的な利用方法は不明.PID (Packet IDentifier)
13 bit の符号なし整数値であり,ペイロードに格納されているデータの種類を示す. いくつかのデータの種類では PID は固定値をとる.transport scrambling control
スクランブル処理(データの乱雑化処理)が施されていない場合には '00' とし,施されている場合は '00' 以外とする.adaptation field control
1 bit 目はアダプテーションフィールドの存在を示すフラグで, 2 bit 目はペイロードの存在を示すフラグである. つまり,
'01' のとき「アダプテーションフィールドはなく,ペイロードのみ存在」,
'10' のとき「アダプテーションフィールドのみ存在,ペイロードはない」,
'11' のとき「アダプテーション,ペイロードともに存在」
である. ちなみに '00' は将来のために予約されている.continuity counter
4 bit の符号なし整数値であり,ペイロードが存在する同じ PID の連続パケットではこのカウンタ値が 1 ずつ加算されていく(ペイロードが存在しない場合には加算されないので注意). 15 (=0xF) が最大値であり,その次はラップアラウンドにより 0 (=0x0) に戻る.
同じ PID の連続パケットでカウンタ値が不連続になればドロップしたとみなすことができるが, MPEG-2 TS ではパケットの重複送信は一度だけ認められているため,カウンタ値が等しいパケットが続いた場合には重複送信なのか,16の倍数分のパケットがドロップしたのかの判定はこの値だけでは判断できない.
また,例外として(後で詳しく説明するが)アダプテーションフィールド内の discontinuity indicator が '1' であるとき,カウンタ値が不連続になることを示すのでカウンタ値が不連続であっても正常となる.
アダプテーションフィールドの構造
http://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-1.pdf の Table 2-6 や 7.3.4 MPEG-2 TS (Transport Stream)パケット - テレビ会議教科書 - テレビ会議教科書 を参照するとよい.
アダプテーションフィールドはヘッダ内の adaptation field control の 1 bit 目が '1' のときのみヘッダの直後に存在する.
前回記事にも書いた通り,アダプテーションフィールドの末尾にスタッフィングが挿入可能であることや,ほかにも可変長のフィールドを多数内包しているので,解析はアダプテーションフィールドの全体の長さや内包する可変長フィールドの長さの情報を正確に読み取りながら行う必要がある. 簡単な構造は図2に示すが,解析する場合は http://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-1.pdf の Table 2-6 など詳細な資料を参照してほしい.
- adaptation field length
adaptation field length の直後からのアダプテーションフィールドのバイト数である.
adaptation field length が 0 より大きいときのみ後続のフィールドが存在する.
discontinuity indicator
'1' のときパケットが不連続であることを示し,ヘッダの continuity counter が不連続であっても正常となる.random access indicator
'1' のとき現在のパケットまたは後続の(同じ PID の)パケットにこのポイントにおけるランダムアクセスを助けるための何らかの情報が存在することを示す.elementary stream priority indicator
'1' のときそのパケットのペイロードが他のパケットのペイロードよりも高い優先度をもつことを示す. '0' のときはこのフィールドが '0' である他のパケットのペイロードと優先度は同じである.OPCR flag
'1' であれば option field 内に OPCR フィールド存在することを示す.splicing point flag
'1' であれば option field 内に splicing countdown フィールド存在することを示す.transport private data flag
'1' であれば option field 内に transport private data フィールド存在することを示す.adaptation field extension flag
'1' であれば option field 内に adaptation field extension フィールド存在することを示す.
後半の5項目(PCR flag ~ adaptation field extension flag)は上記の通り,オプションフィールド内に含まれるフィールドを示すフラグである.
PCR (Program Clock Reference)
PCR (Program Clock Reference) は復号器のタイミングを示すタイムスタンプであり, 33 bit の PCR base と 9 bit の PCR extention (と 6 bit の将来のためにリザーブされたビット) の 48 bit で構成されている. PCR base は 90 kHz (= 27 MHz / 300) クロックカウンタ, PCR extention は 27 MHz クロックカウンタであり, PCR は PCR = (PCR base) × 300 + (PCR extention) により求めることができ, PCR 自体は 27 MHz クロックカウンタとなる.OPCR (Original Program Clock Reference)
OPCR (Original Program Clock Reference) の構造は PCR と同様である. OPCR は他のトランスポートストリームから単一プログラムのトランスポートストリームを再構成する際に用いられるらしいが具体的には不明. ちなみに OPCR は復号器に無視される.splicing countdown
8 bit の符号つき整数値であり,正の値の場合は編集点が到着するまでの同じ PID のパケットの数(ペイロードをもたないパケットなどは除外)を表し,負の値の場合は編集点からパケット数を表す. splicing countdown が 0 のとき,ペイロードの最終バイトは画像または音声フレームの最後のバイトでなければならず,このパケットの最終バイトの直後に編集点がくる.transport private data
可変長フィールドであり,フィールド内の先頭 1 Byte 目が 2 Byte 目以降のフィールドのバイト数を与える. ITU-T | ISO/IEC はこのフィールドのデータを規定してはならない.adaptation field extension
可変長フィールドであり,フィールド内の先頭 1 Byte 目が 2 Byte 目以降のフィールドのバイト数を与える. 拡張されたアダプテーションフィールドである.
adaptation field length の直後からここまでのバイト数の合計が adaptation field length に達していないとき,残りのバイト数分スタッフィングバイト (0xFF) が挿入される.
次回記事
PSI / SI の具体的な種類について次回記事に記そうと思う.
MPEG-2 TS について Part 1
MPEG-2 TS について.
参考資料・サイト
MPEG-2 TS について(メイン)
- 標準規格の入手について(STD-B10)|一般社団法人 電波産業会
一般社団法人電波産業会(ARIB)の規格書.昔は日本語版も無料だったらしいけど,現在は英語版のみ無料.(無料だった頃の日本語版(少し古いかも)が芝◯工大のサーバにミラーされている.) - http://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-1.pdf
MPEG-2に関する規格書. - 7.3.4 MPEG-2 TS (Transport Stream)パケット - テレビ会議教科書 - テレビ会議教科書
MPEG-2 TS パケットのヘッダ,アダプテーションフィールドの構造についての備忘録に使ったサイト. - http://www.jushin-s.co.jp/michi/download/97_t43.pdf
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で使用されている.
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).
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を参照するとよい.)
また,分割される前の意味のあるデータのかたまりをセクションと呼び,セクションは図3のようにパケットのサイズに合わせて分割される.
ここで,セクション1の末尾データが入るパケットはスタッフィングで埋めること(図4上段)もあれば,セクション1の末尾データに続いてセクション2を同じパケットに入れること(図4下段)もできる. (なお,図4ではペイロード末尾にスタッフィングを挿入しているが,上述の通り,アダプテーションフィールド末尾に挿入しても構わない.)
このような構造を実現するためにセクションの先頭データが含まれるパケットのペイロードの先頭 1 Byte 目にはポインタフィールドと呼ばれる新しく始まるセクションの開始位置を表す情報が挿入される.
パケット内に1つのセクションだけが入る場合にはセクションはポインタフィールドの直後から始まるのでポインタフィールドは 0x00 となる. (つまり図4上段のパケットと図4下段の1つ目のパケットのポインタフィールドは 0x00 である.)
図4下段の2つ目のパケットのように2つのセクションが存在する場合,例えば,セクション1の末尾データが 25 Byte 分あれば,セクション2の開始位置はポインタフィールドの直後から数えて 25 Byte 先なので,ポインタフィールドは 0x19 (10進数に直すと 25)である.
次回記事
長くなってしまったので続きは次回記事に記そうと思う.
ntpdateで時刻合わせ
ntpdateによる時刻合わせの備忘録
参考サイト
- ntpdate(8) manページ
- サーバーの時刻合わせコマンド、ntpdateはどのサーバーを参照すべき?:ネットワーク管理の基本Tips - @IT
- NTP/推奨公開サーバ - wiki@nothing
- crontabの書き方 | server-memo.net
ntpdateの設定
オプション
ntpdate(8) manページやサーバーの時刻合わせコマンド、ntpdateはどのサーバーを参照すべき?:ネットワーク管理の基本Tips - @ITによると, ntpdateの時刻合わせには2種類ある.
| オプション | モード | 備考 |
|---|---|---|
| -B | slewモード | 徐々に微調整して時刻を合わせる |
| -b | stepモード | 一気に(強制的に)時刻を合わせる |
1日中稼働するサーバで時刻合わせを行うのであれば,slewモードでの時刻を考えるとよいだろう. 他のオプションについては現状使う予定はないので省略する.
ntpサーバ
プロバイダなどからntpサーバを提供されていなければ,国内の利用可能な公開ntpサーバを用いるとよい. 公開ntpサーバのうち,NTP/推奨公開サーバ - wiki@nothingに載っているものを利用するとよいだろう.
ntpdateではntpサーバを複数指定することができる. 例えば,
$ sudo ntpdate -B ntp.nict.jp jp.pool.ntp.org ntp.jst.mfeed.ad.jp
もしくは,root権限から
# ntpdate -B ntp.nict.jp jp.pool.ntp.org ntp.jst.mfeed.ad.jp
のようにntpdate [オプション -B など] ntpサーバ1 ntpサーバ2 ntpサーバ3 ...の形で指定する.
(ntpdateによる時刻合わせではroot権限が必要なのでsudoもしくはroot権限からの実行が必要となる.)
crontabの利用
24時間稼働のサーバでは定期的に自動で時刻合わせしてくれると助かるだろう. そこで,crontabを利用する.
詳しい書き方,設定の仕方についてはcrontabの書き方 | server-memo.netを参考にするとよいだろう.
crontabのオプション
| オプション | 備考 |
|---|---|
| -e | crontabの設定編集 |
| -l | crontabの設定表示 |
| -r | crontabの設定削除 |
crontabはユーザごとに設定できて,表のオプションと合わせてcrontab (-u ユーザ名) [-e, -l, -r]と実行できる.
-rオプションで誤って設定を削除してしまうのは非常に危険なので実行時には慎重に…
というのが面倒な場合には,別ファイル(例えばmycronというファイル)に設定を書いておき
crontab (-u ユーザ名) mycronとしてもcrontabに設定を反映できる.
このとき,設定の確認はcrontab (-u ユーザ名) -lで確認するよりも,
catコマンドなどでmycronファイルを確認した方が-rオプションの誤消去を防ぐことができるだろう.
crontabの設定
crontabは以下のように書く.
[分] [時] [日] [月] [曜日(0,1,...,7)] [実行したいコマンド]
| 項目 | 値 |
|---|---|
| 分 | 0から59までの数値 |
| 時 | 0から23までの数値 |
| 日 | 1から31までの数値*1 |
| 月 | 1から12までの数値 |
| 曜日 | 0から7までの数値*2 |
*1 例えば,31日がない月に31を設定しても実行されない.
*2 日:0 または 7,月:1,火:2,水:3,木:4,金:5,土:6と指定する.
また,任意の値を設定する際には "*" を用いる.
例えば,毎日0:00にコマンドを実行する場合は
0 0 * * * [コマンド]
と書く.
何分おき,何時間おきのような実行も設定できるが省略する.
以上から,例えば毎日0:05にslewモードで時刻合わせする設定はrootのcrontabに以下のように書けばよい.
5 0 * * * ntpdate -B ntp.nict.jp jp.pool.ntp.org ntp.jst.mfeed.ad.jp
e^(-√s)のラプラス変換
ある日,ラプラス変換の問題を解いていたところ という形が
でてきてしまった.
http://taruibunka.la.coocan.jp/buturi/apma1.pdf を見てみると2.5節「主な関数のラプラス変換一覧」(p.25)の15番に変換公式を見つけたので,これについて記しておく.
関連記事
準備1
まず,資料2.5節「主な関数のラプラス変換一覧」(p.25)の14番の変換公式
を証明する.
証明)
とおくと,
であり,
より,sの平方根がでてくるラプラス変換 - /dev/null に消える前に…の結果を用いると,
が示される.
準備2
一般の関数 について,
が成り立つ.
証明)
変換公式の証明
証明)
準備1,準備2を用いて,
が示された.
sの平方根がでてくるラプラス変換
ラプラス変換した際に がでてきてしまったときに使えるかな…
sの平方根がでてくるラプラス変換公式
http://taruibunka.la.coocan.jp/buturi/apma1.pdf の2.3節「ラプラス変換の公式一覧」(p.17)に
という公式があった.
これについての導出過程が資料にはあまり詳しく記されていなかったのでここに記しておく.
のラプラス変換を
とおく.
ここで, と置換すると,
となる.
ここで についての積分をよく見ると
ガウス積分 Part 3 - /dev/null に消える前に… の結果が利用できることに気づく.
以上によって導出された.
なお,最後の変形には,ラプラス変換の定義
を用いている.
ラプラス変換をなるべく覚えない
ラプラス変換の変換表を暗記するのは面倒…
ということで,なるべく覚えない方法を残しておく.
覚えるべき1つの式
ラプラス変換 | はいてくどかたのヒトリゴト を参考にした.
覚えるべき式はとりあえず1つだけ.
ここで, は任意定数(複素数でもよい),
は非負整数.
ameblo.jp
これだけ覚えておけば,
拡張
簡単のために, は非負整数で定義していたが,階乗の概念を拡張したガンマ関数
を用いて,
を覚えてもよい.
このとき, は任意定数(複素数でもよい),
はとりあえず
をみたす任意実数定数では成り立つ.
( の任意定数で成り立つかもしれないが確認していない…)
ガンマ関数の性質を用いた例を挙げる.
- 性質
これを利用すると(2)は最初に紹介した式(1)に変形できる.
- 性質
(2)においてを代入する.