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的时间去控制字幕的显示
- MPEG2 PTS如何转为DirectShow的Reference Time
- 怎样获取MPEG2/TS流的PTS值
- [DirectShow] 020 - Reference Clocks
- MPEG2-TS音视频同步原理(PCR dts pts)
- MPEG2-TS音视频同步原理(PCR dts pts)
- [DirectShow] 022 - Time Stamps
- java time转为UNIX TIME
- 如何算音频PTS
- 如何成功的转为咨询
- 专业的 mpeg2 decoder
- MPEG2-TS的小结
- java Data time Reference
- Call-time pass-by-reference has been deprecated的解决
- mpeg2
- MPEG2
- MPEG2
- mpeg2
- MPEG2
- python日期加减
- Android KeyCode列表
- 5、Longest Palindromic Substring
- 基站定位接口
- Syline6.5学习心得-web-命令使用
- MPEG2 PTS如何转为DirectShow的Reference Time
- 如何成为php高手?
- ORACLE数据字典的常用查询
- AudioRecord.getMinBufferSize参数解析
- docker命令之push
- 应对面试:《TCP/IP、HTTP、SOCKET的区别》、《HTTP协议详解》、《HTTP头部详解》
- ims 注册鉴权认证过程
- width:100% width:auto; 区别
- 安卓 SD卡写入文件后不能立即显示被写入的文件解决方法