2011-12-01 139 views
2

IMediaSample SetTime()函数需要两个参数REFERENCE_TIME参数。在Delphi 6中,REFERENCE_TIME被定义为类型“LongLong”,这是我用于DirectShow应用程序的编程语言。但是,DirectShow采样器筛选器用于传递新媒体采样的采样时间的回调方法的第一个参数被设置为double。如何在这两个值之间进行转换,以便我可以比较从采样采集器过滤器接收的介质采样与我在推送源过滤器的FillBuffer()方法中生成的REFERENCE_TIME值之间的采样时间?如何在DirectShow采样卡和FillBuffer REFERENCE_TIME之间转换“double”时间戳?

此外,回调方法中采样采集器过滤器提供的采样时间是否会被视为媒体采样的开始时间或结束时间?

回答

4

简单部分:double以秒为单位,而REFERENCE_TIME以100ns为单位。因此转换很简单:多个或除以1E+7

并非如此简单:您可以在一个过滤器图形中捕获一些时间,并且可以在另一个图形中将过滤器中的数据标记为时间戳。这两张图都有时间戳,表示streaming/presentation time,这与图表“运行时间”有关。也就是说,当图形之间传递媒体样本时,可能还会涉及时间戳偏移量。对于结束时间,对于视频媒体样本,样本停止时间可以省略或设置为等于开始时间;与音频停止时间通常可以通过添加缓冲区保存的有效载荷数据的开始时间来计算。 MSDN上

奖金阅读:Time and Clocks in DirectShow

+0

再次感谢。我最终从借用的捕获滤波器中“借用”采样时间来驱动整个系统,并将其转换为我在推送源滤波器中生成的开始/停止参考时间。 –

0

对我来说也已经有点难以认为100个纳秒为单位。所以我也经常在毫秒和100纳秒之间转换。尽管编写自己的函数是非常微不足道的。如果您使用的DirectShow基类的也有文件RefTime.h

在DirectShow的基类中导出的宏这也将完成转换:

double time = 1000; 
REFERENCE_TIME direct_show_time = MILLISECONDS_TO_100NS_UNITS(time);