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が含まれており,mplayerやmencoderは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のソースコードを調べる,などが必要かと思います.