Allegro Moderatoな日常

PC、音楽、食事など、その時はまっている事柄についてそこはかとなく。

「ネットワークメディアプレーヤー」カテゴリーの近況

このカテゴリーの近況は…さんたんたるものです。

ネットワークメディアプレーヤーAV-LS300DWはDVD再生専用機になってます。

かわりに、サーバーに使っていたPCをTVにつないで動画再生を行っています。
(というか、そもそも動画をほとんどTVで見なくなってしまいました。)

それにともないMediaTombも起動すらしてない状態。
MediaTombネタはうちのブログではアクセス数が多く、
続けて書いていきたいネタではあるのですが…

DLNAクライアント機能を持ったTVでも買わない限り、
新しい記事は増えないかもしれません。

tss.pyのC言語版

以前Pythonで作成したTsSplitterの簡易版、tss.py。
C++で書き直そう書き直そうと思い続けてもうすぐ一年になります…w

そんななか、querulousさんがC言語に移植してくださいました!

http://hp.vector.co.jp/authors/VA038175/download/tssplitter_lite.zip

ありがたや、ありがたや。

querulousさんのHPは↓。

http://d.hatena.ne.jp/querulous/

PMTの解析

前回のPAT解析に続き、PMTの解析です。

前回はPATデータの差し替えを行いましたが、とりあえずはこれだけで、
いらないTSパケットを削除しなくてもAV-LS300DWで再生することができます。
ですがせっかくなので、TsSplitterのようにスマートに、いらないパケットを
削除することにしましょう。

残す必要のあるTSパケットを判別するために、PMTを見る必要があります。
前回のPATを例にとりましょう。
前回1つだけ残したPMT情報に記録されているPIDは、0x0101です。
このPIDのPMTを取り出すと…
PMT1
こんな感じになっています。
ぴったり188バイト使われています。
しかしこれだと説明しにくいので、都合のいい位置で改行します。
PMT2
TSヘッダーはPATのときと同じです。PIDは当然0x0101です。
データの最後に32ビットのCRCが入るのも同じ。
8バイト目もセクション長になっていて、0xB4=180バイトのデータが続き、188バイトめいっぱい使っていることがわかります。

PMT3
TSパケットの先頭から数えて12バイト目までは固定長のデータです。
そこから先は、中にかかれている情報によって長さがかわるデータで、
1行で一塊であり、1行に1つのPIDが隠されています。
このPID群は、1つの映像を組み立てるのに必要な、
画像データのTSパケットや、音声データのTSパケット、文字放送データのTSパケット等の
PIDをそれぞれ指し示しています。

この可変長のデータに注目して…
PMT4
1列目はストリーム形式種別とよばれており、この番号で画像用、音声用などの用途が
わかります。
2列目、3列目はご本尊のPIDです。例によって下位13ビットをとりだせばPIDになります。
5列目は、6列目以降に何バイト続くかが記録された情報長です。
これにより一塊のデータがどこで終わるか(今回改行を入れている位置)を知ることができます。

それで…
基本的にここに記録されているPIDをすべて残しておけば間違いないです。
ですが、TsSplitterの処理結果を見ると、どうもストリーム形式種別0x0Dのパケットは
捨てているようなので、tss.pyでも捨てることにしました。
このPMTの例だと、0x0100、0x0111、0x0112、0x0114を残すことなります。

そして最終的に残すTSパケットのPIDは、
PATの0x0000、PMTの0x0101、PMTに記録されている0x0100、0x0111、0x0112、0x0114
の、合計6つとなります。
もちろんこれは今回例として取り上げたデータだけの話で、
PATの固定PIDの0x0000以外は、実際にPATとPMTを調べ、抽出しなければなりません。

次はEIT(番組情報)パケットを解析したいな〜

PATの解析

前回の追記に貼り付けたtss.pyの説明をおりまぜながら、PATの解析の話をば。

mpeg2tsは、TSパケットと呼ばれる188バイトのデータの羅列でできています。
その中でも、まず一番最初に参照しなければならないのが、PATとよばれるTSパケットです。

実際にPATを見てみると…
PAT1
こんな感じになってます。
TSパケットの先頭4バイトはTSヘッダーと呼ばれています。
PATの中身のデータは6バイト以降の水色でくくった部分で、
それ以外の不要部分は0xFFで埋められています。

PAT2
TSヘッダーの最先頭には同期ワード0x47が必ず入っていて、本来これを
基準にパケットの先頭位置を特定します。が、b25の出力後のデータは、
そこまでの処理のどこかで同期がとられていて、必ずTSパケットの先頭から出力されるようなので、
tss.pyには同期処理が入っていません。

2バイト、3バイト目はそのTSパケットの素性を現すID(PID)が入っています。
2バイト目を上位、3バイト目を下位として、下位から13ビットを取り出すとPIDになります。
ちなみにPATのPIDは0x0000と決まっています。(0x6000 & 0x1FFF = 0x0000)

4バイト目の下位4bitは巡回カウンタになっており、この次のPATでは0x5にカウントアップしています。
このカウンタ値が不連続になっていた場合、パケットの欠落があったことがわかります。

PATデータの中身を見ていきましょう。
PAT3
AV-LS300DWで再生できるようにするためにいじらなければならないのは、
?PMT情報、?セクション長、?CRCの3箇所です。

TSにはハイビジョンやワンセグなど複数の映像が多重されていますが、
それぞれの映像はPMTとよばれるTSパケットで管理されています。
このPMTのPIDは固有の値ではないので、どこかに記録されていないと判別できません。
そのPMTのPIDが記録されている部分が、PAT内の?PMT情報です。

PMT情報は4バイトでひとまとまりになっています。
上のPATの例では、3つのPMTがあり、3つの映像が多重されていることがわかります。
3バイト目を上位、4バイト目を下位として、下位から13ビットを取り出すとPIDになります。
上の例の3番目のPMT情報を例にとると、3、4バイト目は0xFFC8で、下位13ビットをとりだせば、
このPMTのPIDは0xFFC8 & 0x1FFF = 0x1FC8となります。
(ちなみに0x1FC8だけはワンセグと決まっているらしいです。)

しかし…AV-LS300DWは、PATに複数のPMT情報があると、なぜか映像を再生してくれません。
ということで、ハイビジョンのPMT情報1つだけ残します。
ハイビジョンかどうかの判定は、本来PMTを見て判別すべきなのかもしれませんが…
tss.pyでは先頭のPMT情報のみ残すようにしています。これでいままでのところは問題ありません。

?のセクション長は、その次のバイトからCRCの終わりまでのバイト数が書かれています。
当然PAT情報が減っているので、このセクション長も減らす必要があります。
セクション長は12ビットありますが、PATが255バイトを超えるようなことは無さそうなので、
tss.pyでは0x19を0x11に書きかえています。

最後に?CRCを計算しなおします。
CRCへはPATデータの頭からPMT情報のお尻までを入力します。
CRCの仕様は一般的なCCITTの32ビットCRCです。
詳細は以下の付録Bにかかれています(チェック側ですが)。

■ 参考文献
ARIB標準規格:デジタル放送に使用する番組配列情報
http://www.arib.or.jp/english/html/overview/doc/2-STD-B10v4_6.pdf

???を書き換えると、最終的に↓のようになります。
PAT4
後はこれを、全PATに対して差し替えればいいのですが、TSヘッダーの巡回カウンタ値は
保存しなければならないので、書き換えないようにご注意を。

次回はPMTの解析の話でも。

続・AV-LS300DWでts

TsSplitterを使ってtsファイルを加工することにより
AV-LS300DWでもtsが再生できることがわかりました。⇒ 前回の話
がしかし、TsSplitterはwindows用のソフトです。

なんとかLinuxだけで完結したいのですが…。
TsSplitterのためだけにwineをつかうのは、なんだか負けた気がしますしw

ということで、TsSplitterとtsselectが出力するtsデータの差分を眺めてみることに。

悪戦苦闘の末、PATというtsパケットに差異があることがわかりました。
PATはtsデータのもっとも基本となるテーブルで、PMTとよばれるテーブルのIDを保持しています。
さらにPMTは、映像や音データ等のIDのセットを保持しており、HDや1seg毎にそれぞれ
一つずつ存在します。
なので、PATには複数のPMTのIDが書かれているわけですが、
これがAV-LS300DWのお気に召さず、再生をしてくれない原因となっていました。

TsSplitterは、1segの映像や音データそのものを削除するだけでなく、
PAT情報もPMT一つのみ残すように書き換えているようです。

この解析の副産物で、どのtsパケットを残せばいいのかも
だいたいわかりました。…ただのカンですがw
・PAT固有のID : 0x0000
・PATが指し示すPMTのID
・PMTが指し示す映像、音声、同期をとるためのクロック(PCR)のID

てことで…

必要なtsパケットを残しつつ、PATを書き換えるプログラムをPythonで作成。
なんとかLinuxだけで完結することができるようになりました。
(需要があればソースを公開します。…まー無いかw)

ただ処理時間がちょっと長いでしょうか。tsselectの倍ちかくかかってます…w
暇なときにC++で書き直そう。

■ 参考文献
ARIB標準規格:デジタル放送に使用する番組配列情報
http://www.arib.or.jp/english/html/overview/doc/2-STD-B10v4_6.pdf

続きを読む »

 | HOME |  »

Calendar

03 | 2017-04 | 05
S M T W T F S
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

Categories

Recent Comments

Profile

son

son

ババ〜〜トリック♪

Monthly

Recent Entries

Recent Trackbacks

Appendix

顔文字教室

お小遣い稼ぎ!
スマホでお小遣い稼ぎ!
DTIブログポータルへ
このブログを通報
Report Abuse