如何在DirectShow.NET中重新构建帧?

时间:2012-02-14 20:59:39

标签: c# directshow frame directshow.net seek

我想应该用IMediaSeeking SetPositions完成,但我不知道如何在里面定义参数。

2 个答案:

答案 0 :(得分:2)

没有专门的方法可以在DirectShow中退回(因为现有的步骤可用于前进)。是的,你可以使用IMediaSeeking::SetPositions但是请注意,实现它的不是DirectShow本身,而是实际的底层过滤器,因此对重新定位的支持取决于过滤器和实现,并且可能仅限于,例如,步进仅通过关键帧(拼接点)。 DirectShow.NET是一个基于DirectShow的包装器,它也不会在DirectShow为步进提供的东西上添加任何东西。

答案 1 :(得分:0)

IBasicVideo                 *pBasicVideo=NULL;//Interface to the Ibasic Video
HRESULT                     hr;
REFTIME                     pavgfrt=0;//Get the reftime variable
REFERENCE_TIME      pnowrt=0;//Get the reference time variable
pBasicVideo->get_AvgTimePerFrame(&pavgfrt);
pBasicVideo->get_AvgTimePerFrame(&pavgfrt);//Get the avg time per frame in seconds

pSeek->GetCurrentPosition(&pnowrt);//Get the current time in the unit of 100 nanoseconds
REFERENCE_TIME temp=pnowrt;//store it in a temp variable
REFERENCE_TIME temp1=(REFERENCE_TIME)(pavgfrt*10000000);//convert avg time into the format of current time
pnowrt=temp+temp1;//Add to framestep forward and subtract to framestep backward
pSeek->SetPositions(&pnowrt,AM_SEEKING_AbsolutePositioning, NULL,AM_SEEKING_NoPositioning);//Set the seeking position to the new time
pnowrt=0;//Reset the time variable

这适用于C ++。在C#中包装此代码对您来说可能并不困难。希望这会有所帮助。