IMediaSample SetTime()函数需要两个 REFERENCE_TIME 参数。 REFERENCE_TIME被定义为Delphi 6中的类型“LongLong”,这是我用于DirectShow应用程序的编程语言。但是,DirectShow样本采集过滤器用于传递新媒体样本的采样时间的Callback方法的第一个参数被强制转换为 double 。如何在这两个值之间进行转换,以便比较我从样本采集器过滤器接收的媒体样本与我在推送源过滤器的FillBuffer()方法中生成的REFERENCE_TIME值之间的采样时间?
此外,回调方法中Sample Grabber过滤器提供的采样时间是否会被视为媒体样本的开始时间或结束时间?
答案 0 :(得分:4)
简单部分: double
以秒为单位,REFERENCE_TIME
以100 ns为单位。因此转换很简单:多次或除以1E+7
。
不那么简单:您在一个过滤器图表中捕获了抓取器中的一些时间,并在您的过滤器中为另一个图形中的数据添加时间戳。两个图都有时间戳来表示streaming/presentation time,这与图表“运行时间”有关。也就是说,当媒体样本在图表之间传递时,也可能涉及时间戳偏移。
对于结束时间,对于视频媒体样本,可以省略样本停止时间或将其设置为等于开始时间;音频停止时间通常可以通过添加缓冲区保存的有效载荷数据的开始时间来计算。
MSDN上的额外奖励:Time and Clocks in DirectShow
答案 1 :(得分:0)
对我而言,在100纳秒单位中思考起来也有点困难。所以我也常常在毫秒和100 ns单位之间进行转换。虽然编写自己的函数非常简单。如果您使用DirectShow BaseClasses,还会在文件RefTime.h
这也可以进行转换:
double time = 1000;
REFERENCE_TIME direct_show_time = MILLISECONDS_TO_100NS_UNITS(time);