TSのPCR

先の記事で,mplayer のEDLが効かない,時間表示が妙,などと書きました.その続きです.
MPEG transport streamなどをチラ見すると,PCR(Program Clock Reference)という音声と映像を同期させるタイムスタンプらしきものをmplayerは表示しているらしいです.これが,何らかの(放送側の?)時間を基点として計られたものらしく,MediaInfoでみると,Videoの(Delay_Originalの近くの)Delayという値になっていました.ARIBだかITUの勧告書のどのあたりに書かれているのかは不明ですが,とりあえずwikipedia情報ではそうらしいです.
という事は,この値を拾ってEDLをオフセットすればジャンプできるのでしょうか?

対策

$ media-info.exe -f foo.ts | grep Codec
Codecs Video                     : MPEG-2 Video
Codec                            : MPEG-TS
Codec                            : MPEG-TS
Codec/Extensions usually used    : ts m2t m2s m4t m4s ts tp trp
Codec                            : MPEG-2V
Codec                            : MPEG-2 Video
Codec/Family                     : MPEG-V(以下略)

$ media-info.exe -f foo.ts |grep Delay
Delay                            : 43373001.433
Delay                            : 12h 2mn
Delay                            : 12h 2mn 53s 1ms
Delay                            : 12h 2mn
Delay                            : 12:02:53.001
Delay_Original                   : 82825734
Delay_Original                   : 23h 0mn
Delay_Original                   : 23h 0mn 25s 734ms(以下略)


などどなるので,つぎのスクリプトで,TSの場合,Delayを取り出すということができます.

ccodec=$(media-info -f "$ipath"|awk '/^Codec *: *.+$/{print $3; exit;}')

if [[ "$ccodec" == "MPEG-TS" ]]; then
    delay=$(media-info -f "$ipath"|awk '/^Delay +: [0-9]+\.?[0-9]*$/{ print $3; exit;}')
else
    delay=0;
fi


"$ipath"にはファイル名をあらかじめ引き当てます.Delayの単位はミリ秒(msec)です.TSには,Video,AudioそれぞれのDelayが含まれており,mplayermencoderはVideoのDelayをオフセットに使用しています.これにより,VideoとAudioの遅れが計算できるはずですが,その値もMediaInfoで取り出すことができます.

$ media-info.exe -f foo.ts | grep delay
Video delay                      : -196
Video delay                      : -196ms
Video delay                      : -196ms(以下略)


上記のようなDelayを 先の記事のシェルに組み込んだら,EDLが働くようになりました.つまり,TSから直接EDLを作成して,地デジのTSをCMスキップで視聴できるようになったということです.
ただし,インフォマーシャルという長いCMは番組本編と解釈されるようなので,CMの長さは,14〜60秒 としても良いような気がしますが,これはてきとーに扱うことにします.
ここで終われるならば,良かったのですが,初回再生での冒頭スキップが上手くいきませんね.巻き戻しならば,場合によってはスキップします.例えば,EDLのスキップ開始位置とDelayの値が一致している場合は,巻き戻しでもスキップしませんが,Delayが「43373.00」,EDLが「43373.01」などと,0.01違いの値でもあれば,巻き戻したときにはスキップしてくれます.それでも,初回の再生では両方ともスキップできません.mplayer恐るべし.
もろもろ含めまだ終息できそうもないで,単一のシェルをてきとーにばらしたほうが使い勝手がいいと思いました.一旦作成した,中間生成物(wav,mp3等々)を都合に合わせて再利用しながらの方がデバッグも楽だし,運用上,CMの上限再設定などでも,好都合だと思えます.ぼちぼちとやりますか.
とりあえず,おしまい
本当にPCRか?という疑問もあります.TOT(Time Offset Table)というものもあります.MediaInfoは何を抽出しているのでしょう?(1) ARIBなどで,PCR,TOTの本来の意義を調べる,(2)MediaInfo,mplayerソースコードを調べる,などが必要かと思います.