【问题标题】:directshow source filter SetTimedirectshow 源过滤器 SetTime
【发布时间】:2023-03-15 18:16:01
【问题描述】:

我正在编写一个directshow源过滤器来读取特定的原始文件,原始文件在每一帧中都包含时间戳(utc时间)

我的过滤器是从微软SDK的“Push Source Filters Sample”修改而来的,所以最重要的是覆盖GetMediaType()、DecideBufferSize()和FillBuffer()。

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

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

有没有更好的解决方案?

【问题讨论】:

    标签: directshow


    【解决方案1】:

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

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

    MSDN:Time Stamps in DirectShow

    【讨论】:

    • 非常感谢,这听起来是一个可行的方法,但是实现seek接口时事情会变得复杂。顺便说一句,我尝试使用 SetMediaTime() 来保存原始时间,但它不起作用(SampleGrabber 失败到 GetMediaTime())
    • 是的,媒体时间是一种不可靠的,我建议你不要使用它。而是直接从源过滤器获取基准时间,而不是从媒体样本的属性中获取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    相关资源
    最近更新 更多