MPEG2 PTS如何转为DirectShow的Reference Time


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值