任务:从mpeg2视频文件中抓取任意帧。现在我使用自定义渲染过滤器来抓取,但在所需的帧上定位视频有问题。
我使用SetPosition(),在Pause()通过图传递帧之后,等待过滤器接收第一帧并停止()。
如果我逐帧得到,首先我收到这个时间帧的精确,然后这个帧重复几次,然后再收到确切的帧。
为什么SetPosition会得到错误的结果?
发布于 2009-06-15 18:37:14
解码器需要从前一I帧开始解码。通常,多路分解器将在此之前至少一秒开始推送数据。当您开始接收帧时,您应该检查时间戳,看看它们是否是您想要的帧。您的过滤器将收到一个"NewSegment“调用,该调用给出了在文件中查找的开始位置。如果将此开始时间添加到帧上的采样时间,则将获得帧在文件中的绝对位置,并可以将该位置与请求的位置进行比较。
G
发布于 2009-10-27 20:29:26
渲染完图形后,需要暂停图形。在此之后,您可以使用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。
https://stackoverflow.com/questions/997062
复制相似问题