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的时间去控制字幕的显示