首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

DirectShow里面时间戳的有关问题

2012-02-10 
DirectShow里面时间戳的问题看了DirectShow开发指南和SDK里面的帮助,对时间的设置和同步的问题还是不太清

DirectShow里面时间戳的问题
看了DirectShow开发指南和SDK里面的帮助,对时间的设置和同步的问题还是不太清楚,有没有人可以就这个问题解释一下?
1、对于网络接收的Live   Source,如果是推模式下的话,是不是Sample的时间戳应该由这个Source   Filter决定?如果是拉模式,是不是应该由Paser或者Spliter或者Decoder来决定时间戳?
2、假如在推模式下,Source   Filter没有设置时间戳,那么这个时候Renderer是怎么处理?会出现什么异常的情况吗?
3、或者说在实现流媒体客户端的时候,始终应该是由Decoder来设置时间戳?

[解决办法]
首先跟你肯定一点Decoder是不会重新设置时间戳的,有也只是做一个调整的处理。如果是播放本地的文件通常文件中告诉了你每一个数据块的开始时间点和Duration(典型就是AVI文件有一个索引表)。DShwo对于时间戳的处理是以流时间作为参考对象的。

----------t1------t2-------t3-------t4-----> 流时间。

----------sample1----sample2-----sample3----> ....

如上图所示:如果Sample1的开始时间是t1那么它将在流的t1时刻开始播放,如果是t2那么将在t2时刻开始播放。这就是Dshow的音视频同步播放的原理。

当然Dshow进行音视频播放是的参考时间轴是AudioRender或者说是硬件的时钟。那么我们通过调用IReferenceClock::GetTime()来获取流开始的时间点,作为我们播放Sample的“0”起始时刻。我想这就是所谓的相对运动吧。


所以一般时间戳的设置是由拉模式下的Parser、推模式下的Source Filter。对于推模式如果是实时的采集一般不打时间戳(这个缘故DirectShow开发指南和SDK里面的帮助有说明),对于网络接收的Live Source,我们要知道网络发送过来的数据块上的起始播放时间和结束播放时间,一般服务器端应该有处理。如果没有那么就需要我们对这些数据进行分析了。

热点排行