我希望能够在MPEG-2文件中寻找任意帧(来自DVD,我猜它叫做MPEG-2节目流)。到目前为止,我一直在使用OpenCV 2.1来访问这些帧,但这只能在逐帧的基础上工作(只有前向搜索)。后来当我安装OpenCV 2.3.1时,可能性已经丢失,即仅限于AVI。无论如何,我想在没有OpenCV的情况下做到这一点。我设法寻找关键帧(我猜)或每一个帧(例如每12帧)。现在,看看VirtualDub框架的准确搜索是可能的。它说:''解析交错的MPEG-2文件''。究竟是什么意思,我必须从哪里开始做同样的事情?它是否合法,我记得在某个地方读过一些东西,但实际上并不记得。我正在使用directshow在C ++中编程。据我所知,directshow不会这样做。然后我正在研究CBaseFilter,流时间方法等,但在我深入研究这个复杂的主题之前,我想知道这是否是正确的方法。期待您的回答,谢谢!
@ Geraint:过滤器图表的代码片段:
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder);
CoCreateInstance(CLSID_MPEG2Demultiplexer,NULL,CLSCTX_INPROC,IID_IBaseFilter,(LPVOID *)&pib);
CoCreateInstance(CLSID_CMPEG2VidDecoderDS,NULL,CLSCTX_INPROC,IID_IBaseFilter,(LPVOID *)&pib2);
pGraphBuilder->AddFilter(pib,L"Sample Splitter");
pGraphBuilder->AddFilter(pib2,L"Sample Decoder");
ZeroMemory(&am_media_type, sizeof(am_media_type));
am_media_type.majortype = MEDIATYPE_Video;
am_media_type.subtype = MEDIASUBTYPE_MPEG2_VIDEO;
am_media_type.formattype = FORMAT_MPEG2Video;
pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID *)&pMediaControl);
pGraphBuilder->QueryInterface(IID_IMediaSeeking, (void**)(&pMediaSeeking));
pGraphBuilder->QueryInterface(__uuidof(IVideoFrameStep), (PVOID *)&fst);
pGraphBuilder->QueryInterface(IID_IMediaEvent, (void **)&imev);
pGraphBuilder->QueryInterface(IID_IBasicVideo,(LPVOID *)&ibv);
pGraphBuilder->RenderFile(FILENAME,0);
然后我使用IMediaSeeking来寻找视频。我也试过帧步进(因此上面的参考文献)。
答案 0 :(得分:3)
DirectShow能够提供帧精确搜索。但是,如果没有索引,则基于文件启动的时间偏移,而不是帧计数。
使用IMediaSeeking设置开始时间。解复用器将在此之前以某种方式开始传送压缩帧。解码器将在前一个关键帧开始解码,但将丢弃所选起点之前的任何帧。