MPEG2 PTS如何转为DirectShow的Reference Time

来源:互联网 发布:js判断两个字符串相等 编辑:程序博客网 时间:2024/05/24 22:43


MPEG2 PTS如何转为DirectShow的Reference Time

某种字幕的Decoder,已经可以显示出来但是字幕和视音频不同步。上面的filter是MPEG2   Demux,下面的是overlay   mixer。MPEG2   demux输出PES到我的filter,我虽然从PES里面拿到了PTS,但是不知道怎样才能转换到Refrence   Time,这个对我很重要,因为我要对每个输出的Sample打时戳SetTime。如果不打时戳,字幕的显示和视音频不同步。可是MPEG2   Demux并不对输出的PES   打时戳,我只好从PES里找PTS来打时戳。 

PTS和Refrence   Time的转换关系,大致是:     
Refrence   Time   =   (PTS   *   300)   /   27     
至于Refrence   Time的单位,10000000,记得不是很清楚了.     
请你参考ISO/IEC   13818-1   (System)

directshow中的时间戳   =   mpeg   pts   *   UNITS   /   90000
UNITS是directshow中定义的常量,可以直接使用。用以从单位秒转化为directshow中的参考时间单位。
const   LONGLONG   MILLISECONDS   =   (1000);                         //   10   ^   3  
const   LONGLONG   NANOSECONDS   =   (1000000000);               //   10   ^   9  
const   LONGLONG   UNITS   =   (NANOSECONDS   /   100);             //   10   ^   7



您的公式只是把pts的单位转化到以100纳秒为单位。可是这样转换后的pts和dshow的stream   time之间还是有很大的不同,因为很简单的一个事实是stream   time通常从0开始,而pts在一个文件流里可能从任何值开始。我试了一下:pts*UNITS/90000   -   m_tStart.m_time,可是结果仍然不对,那个m_tStart也好像是个随机值。假如m_tStart是流里的第一个pcr就好了,但是非常可惜,竟然不是。不知是否他们之间有换算关系?

你应该减去第一个pts值作为偏移,而不是m_tStart     
(PTSn   -   PTS1)*UNITS/90000



因为我做的是字幕的decoder,可能第一个字幕的pts要在流播放以后很久才能到来。我不可能在我的subtitle   decoder里拿到音频的pts的。这样还是会有不同步的问题。

字幕的pts应该是字幕的显示时间,当然它还应该有一个结束时间,你可以同过别的方式得到graph的时间去控制字幕的显示

0 0
原创粉丝点击