手動でMPEG-TSからPCRを抜き出す
ts2someにも書きましたが、MPEG-TSからPCRと動画PIDと音声PIDを抜き出す目処が立ってきました。といっても、MPEG-TSを完全に理解したわけではないので、実装までにはまだ暫くかかりそうです。
あるMPEG-TSファイルのPMTブロックのTSヘッダー以降を抜き出すと、次のようなバイナリーが得られます(AAC音声記述部分以降は省略)
00000010101100000111110001101100
00111001110101010000000000000000
11100001000000001111000000001100
00001001000001000000000000000101
11100001000000011100000100000001
10000100110111100000000111101111
00000010111000010001000111110000
00000110010100100000000100000000
11001000000000010100011100001111
11100001000100101111000000000011
で、色んな資料や解析ツールを参照して、手動で分解していくと次の結果が得られて、見事にPCRとMPEG-2のPIDとAACのPIDが抜き出せました。分かりやすいようにブロック毎に段落をつけています。
00000010
1
0
11
000001111100
0110110000111001:Program_Number:0x6C39
11
01010
1
00000000
00000000
111
0000100000000:PCR_PID:0x0100
1111
000000001100
00001001
00000100
0000000000000101
111
0000100000001
11000001
00000001
10000100
11011110
00000001
11101111
00000010:Stream_Type:0x02:MPEG2 VIDEO
111
0000100010001:Elementary_PID:0x0111
1111
000000000110
01010010
00000001
00000000
11001000
00000001
01000111
00001111:Stream_Type:0x0F:MPEG2 AAC
111
0000100010010:Elementary_PID:0x0112
1111
000000000011
後はこれをPerlのプログラムに落とし込んで行けばOKのはずですが、MPEG-TSによってはPMTの値をうまく抜け出せないことがあり、色々と試行錯誤が必要のようです。
何のこっちゃと言われそうですが、ようはPerlでMPEG-TSそのものを解析して、自動でDGIndexから確実にMPEGとAACを吐き出させる(Demux)目処が立ちそうということです。(PerlがDemuxするわけではないです・・・)
Program_Info_Lengthは1ビット単位ではなくて、8ビット単位を一つと数えるとは気づかず、ここで足踏みしてしまいました。
年内には何とかしたいな・・・。








