任务:从mpeg2视频文件中抓取任意帧。 现在我使用自定义渲染过滤器来抓取,但在所需帧上定位视频的问题。
我使用SetPosition(),在Pause()之后通过图形传递帧,等待过滤器接收第一帧和停止()。
如果我逐帧获取,首先我会在此时间帧内收到精确数据,此帧重复一次,然后再次确切帧。
为什么SetPosition会得到错误的结果?
答案 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。