SetPosition得到错误的结果

时间:2009-06-15 16:29:38

标签: winapi video directshow

任务:从mpeg2视频文件中抓取任意帧。 现在我使用自定义渲染过滤器来抓取,但在所需帧上定位视频的问题。

我使用SetPosition(),在Pause()之后通过图形传递帧,等待过滤器接收第一帧和停止()。

如果我逐帧获取,首先我会在此时间帧内收到精确数据,此帧重复一次,然后再次确切帧。

为什么SetPosition会得到错误的结果?

2 个答案:

答案 0 :(得分:3)

解码器需要在前一帧开始解码。通常,解复用器将在此之前至少开始推送数据一秒钟。当您开始接收帧时,您应该检查时间戳以查看它们是否是您想要的那个。您的过滤器将收到“NewSegment”调用,该调用将在文件中提供搜索开始位置。如果将此开始时间添加到帧上的采样时间,您将获得文件中帧的绝对位置,并且可以将其与您请求的位置进行比较。

答案 1 :(得分:0)

渲染图形后,您需要暂停图形。之后,您可以使用SetPositions更改要显示的帧。

这样的事情:

int ShowFrame(long lFrame)
{
    if (FAILED(m_pMC->Pause()))
       return -1;
    LONGLONG llUnknown = 0;
    LONGLONG  llTime = LONGLONG(m_lFrameTime) * lFrame + m_lFrameTime / 2;
    GUID TimeFormat;
    if (FAILED(m_pMS->GetTimeFormat(&TimeFormat))) return -1;
    if (TimeFormat == TIME_FORMAT_MEDIA_TIME)
    {
       llUnknown = llTime;
    }
    else
    {
       if (FAILED(m_pMS->ConvertTimeFormat(&llUnknown, &TimeFormat, llTime, &TIME_FORMAT_MEDIA_TIME))) return -1;
    }
    if (FAILED(m_pMS->SetPositions(&llUnknown, AM_SEEKING_AbsolutePositioning, 0, AM_SEEKING_NoPositioning))) return -1;
    return 0;
}

m_lFrameTime是每帧的时间,您可以进入自定义渲染器。连接视频渲染器引脚后,您可以在该引脚上获取VIDEOINFO :: AvgTimePerFrame。