TVTDataBroadcastingWV2で必要そうなPID
だいぶ長くなってたので1記事にまとめちゃうシリーズから独立
ちなみに実装内容はコード見た方が早いです。どっちかというとコードを書く前に知りたかった必要な物と足りてない物、SITから得られそうな物の理解のためのメモ書きです。
とりあえずTSを眺める(2022/04/18)
実機で再生できた某の192Bytesなデータ放送入りTSが見れなかったので未加工で条件が近いTSを用意し、確認。
ソース追うのが早そうだけどとりあえず見比べてみる
tsselect.exe "sample_NULL.ts"
processing: finish
pid=0x0000, total= 2384, d= 0, e= 0, scrambling=0, offset=138932 //PAT
pid=0x0001, total= 24, d= 0, e= 0, scrambling=0, offset=7351364 //CAT
pid=0x0010, total= 239, d= 0, e= 0, scrambling=0, offset=644088 //NIT
pid=0x0011, total= 238, d= 0, e= 0, scrambling=0, offset=2198660 //SDT
pid=0x0012, total= 11658, d= 0, e= 0, scrambling=0, offset=65800 //H-EIT
pid=0x0014, total= 47, d= 0, e= 0, scrambling=0, offset=5378304 //TOT
pid=0x0023, total= 123, d= 0, e= 0, scrambling=0, offset=686952 //SDTT
pid=0x0024, total= 238, d= 0, e= 0, scrambling=0, offset=803324 //BIT
pid=0x0027, total= 2143, d= 0, e= 0, scrambling=0, offset=263200 //L-EIT
pid=0x0028, total= 6, d= 0, e= 0, scrambling=0, offset=41286868 // CDT?
pid=0x0029, total= 12, d= 0, e= 0, scrambling=0, offset=49444 //CDT
pid=0x0031, total= 2382, d= 0, e= 0, scrambling=0, offset=4136 //ECM
pid=0x0100, total= 4119, d= 0, e= 0, scrambling=0, offset=26508 //PCR
pid=0x0101, total= 4770, d= 0, e= 0, scrambling=0, offset=50008 //PMT
pid=0x0111, total= 1525162, d= 0, e= 0, scrambling=0, offset=0 // MPEG2
pid=0x0112, total= 42306, d= 0, e= 0, scrambling=0, offset=1128 // AAC
pid=0x0114, total= 47, d= 0, e= 0, scrambling=0, offset=722672 // CC
pid=0x0740, total= 34293, d= 0, e= 0, scrambling=0, offset=4888 //以下データ
pid=0x0750, total= 45454, d= 0, e= 0, scrambling=0, offset=7144
pid=0x0751, total= 7919, d= 0, e= 0, scrambling=0, offset=10340
pid=0x0752, total= 452, d= 0, e= 0, scrambling=0, offset=391980
pid=0x0960, total= 76007, d= 0, e= 0, scrambling=0, offset=1504
pid=0x0961, total= 58601, d= 0, e= 0, scrambling=0, offset=376
tsselect.exe "sample-192_NULL.ts"
processing: finish
pid=0x0000, total= 18096, d= 0, e= 0, scrambling=0, offset=133668 //PAT
pid=0x001f, total= 2586, d= 0, e= 0, scrambling=0, offset=2722804 //SIT
pid=0x0100, total= 31291, d= 0, e= 0, scrambling=0, offset=34216 //後は同じ
pid=0x0101, total= 36193, d= 0, e= 0, scrambling=0, offset=0
pid=0x0111, total=10279963, d= 0, e= 0, scrambling=5745, offset=188
pid=0x0112, total= 321407, d= 0, e= 0, scrambling=0, offset=3760
pid=0x0114, total= 399, d= 0, e= 0, scrambling=0, offset=5892672
pid=0x0740, total= 260530, d= 0, e= 0, scrambling=0, offset=1316
pid=0x0750, total= 345120, d= 0, e= 0, scrambling=0, offset=4700
pid=0x0751, total= 60144, d= 0, e= 0, scrambling=0, offset=37036
pid=0x0752, total= 3467, d= 0, e= 0, scrambling=0, offset=216388
pid=0x075e, total= 425, d= 0, e= 0, scrambling=0, offset=999032
pid=0x0960, total= 577140, d= 0, e= 0, scrambling=0, offset=7708
pid=0x0961, total= 445201, d= 0, e= 0, scrambling=0, offset=3384
TvtPlay+TVTestで確認しているので192Bytesなデータ放送入りTSは188に変換されて再生されるぽいけれど念の為全てタイムスタンプを抜いた188Bytesになっている状態で確認している。
開発者ログを見る感じではPAT読み込みからデータ放送の読み出しまででコケているような感じだったのでともかくPATを眺めてみる
別件でTS解析のコードを書いていたのでそれで確認したところでPATにおいてSIDが0のプログラムが示すPID(これがNIT)が本来なら0x10に向いているところが0x1fに向いていた(要するにSITに向いている)
→これについてARIB TR-B15 Part1に記述されてた。
これを元にデータ放送が見れるTSから0x10をTSSelectで削った後に再生すると再現。
そのほかにもひたすら削ってみた感じ0x10~1fあたりは必要っぽくてデータ放送閲覧不可になるかTOTを失って本来の時間ではなく現在の時間で表示されるようになった(確かこれ実機だと本来の時間で出てくるのでちゃんとSITの時間を見ているのだと思う)
2022年4月19日 追記:EITは不要になったっぽい(https://github.com/otya128/web-bml/commit/5c05dd14783b17fcbc779198bc20d056cbfd2917)
0x20~2fは全て削って問題なかったので省略(TSSplitterでも削られるところでもある)
まあ簡単にいうとTSSplitterのHD+EITオプションにデータ放送を残すぐらいのPIDが残っていればいいらしいです。
192bのTSのSITにどこまで情報が残っているかはわからないのでみてみた方が早そう
→ARIB TR-B15 Part1見る限りではどうやらSITが扱える記述子(STD B10の1部の5.3にある)に放送ID周りがあるっぽくて
network_idとかevent_idやbroadcast_id(東京091とかだと23608なアイツだった気がする)NIT同等のデータは得られそう(NITも得られるものがnetwork_idなのでSITを参照してデータ放送を表示している可能性が高いっぽい(TOTにしろ何かしらの手段で時間を計算できそうな記述子もありそうだしEPGも記述子にありそうなのでおそらくここを真面目に読めば閲覧ぐらいはなんとかなりそうな気もする)問題はSDTか。この内容をこれ以上深追いするなら独立記事にするかも (なので記事化した)
つづき(2022年4月19日)
参考資料(Network Information Table)
基本的にARIB STD-B32v3 Part3(今だとV3.11)を読んでいるのですが
mpeg2ts の解析(2): PSI テーブルのパース、PAT, PMT を例に (2012-09-16)
が比較的わかりやすいのでここを例にNITのメモ
規格書のページ的にはpdfページ換算で67pあたりです。
PAT/PMTのlast_section_numberまでは順序は同じです。(そこまでが該当ページの図のHeader扱い)けどテーブル識別子
その後が
Network_Infomation_Table(){
(前略)
last_section_number 8 uimsbf
reserved 4 bslbf
network_descriptor_length 12 uimsbf
descriptor network_descriptor_lengthで示された長さ(バイト単位) uimsbf
reserved 4 bslbf
transport_stream_loop_length 12 uimsbf
while(i < transport_stream_loop_length){
transport_stream(){
transport_stream_id 16 uimsbf
original_network_id 16 uimsbf
reserved 4 bslbf
transport_stream_descriptor_length 12 uimsbf
descriptor transport_stream_descriptor_lengthで示された長さ(バイト単位) uimsbf
}
}
CRC 32 rpchof
}
original_network_idがおそらくCS1/CS2とかので、
transport_stream_idはおそらく局毎のIDっぽい。
でdescriptorはなんだ?→(サービス一覧?)
おそらく名前(関東0とかほげほげテレビとか出てくるところ)ですが、深追いしたくないので調べてないです各自で調べてみてください。名前担当はSDTっぽいしから周波数情報とかあの辺が書いてあるパテーンだと思う(そこまでここまで追ってない)
と、大体何が得られて必要かは目処が付いたので、SITを読んでみて実際に食わせてみる
TVTDataBroadcastingWV2というよりweb-bmlがnode-aribtsを用いてTSの処理を行っているのでnode-aribtsのtest/test.jsを参考にあれこれ試して出来そうだったので出来た差分がこれ
SITから拾ってきた物はEventID,TSID,番組名,TOTあたりです。
一通り解析して時間軸で表示できるプラグインなりツール書くと楽しいのかもしれない(けれどとりあえず今回の目的はここまでなので一旦おわりとします)
パーシャルTSに含まれるSITからデータ放送閲覧に必要そうな情報を得られるようにした · tana3n/web-bml@14eb7b9
多分そのうちReleaseに反映されるんじゃないのかな……
→2022年5月10日追記
Releaseでてたので使ってみてね!
Release 0.4.0 · otya128/TVTDataBroadcastingWV2
過去にiLink経由でキャプった物とかデータ放送も録画できるデッキで録画したTSがあったら遊んでみると良いかもしれないですね。あんまりないとか言わない