2013-02-27 81 views
0

我写一个DirectShow源过滤器来读取特定的原始文件,原始文件包含时间戳(UTC时间)在每一帧DirectShow的源过滤SETTIME

我的过滤器从微软SDK的修改“推源过滤样本” ,所以最重要的是覆盖GetMediaType(),DecideBufferSize()和FillBuffer()。

我的问题是在FillBuffer(IMediaSample * pSample)中。我不知道如何在此函数中正确调用pSample-> SetTime(),因为时间戳从大数开始,帧将等到StreamTime达到时间戳。

问题可以通过。减去来解决每个帧上的偏移,但我需要在下游过滤器(SampleGrabber)原始时间戳

是否有更好的解决方案?

回答

0

媒体样本没有绝对时间戳。您需要从正在流式传输的片段中的所有样本中减去前导媒体采样时间,以便第一个媒体采样为零,并正确设置以下内容。

如果您可以使您的采样器回调可用的基准时间戳(您正在减去),那么您可以将其添加回来并恢复正确的绝对时间。

MSDN:Time Stamps in DirectShow

+0

非常感谢,这听起来可行的方法,但在实施寻求接口事情会变得复杂。顺便说一句 我尝试使用SetMediaTime()来保存起始时间,但它不起作用(SampleGrabber对GetMediaTime()不正确) – 2013-02-27 09:01:04

+0

是的媒体时间是一种不可靠的,我建议你不要使用它。而是直接从源过滤器获取基准时间,而不是从媒体样本的属性获取。 – 2013-02-27 09:03:05