我希望能够在MPEG-2文件(从DVD,我猜它被称为MPEG-2程序流)中寻找任意帧。到目前为止,我一直在使用OpenCV 2.1来访问这些帧,但这只能在一帧接一帧的基础上工作(仅限前向搜索)。后来,当我安装OpenCV 2.3.1时,这种可能性就消失了,也就是说,仅限于OpenCV。无论如何,我希望在没有OpenCV的情况下做到这一点。我已经设法寻找关键帧(我想)或每某某帧(例如每12帧)。现在,查看VirtualDub帧的精确查找是可能的。上面写着:“解析交错的MPEG-2文件”。这到底是什么意思,我必须从哪里开始做同样的事情?这是合法的吗,我记得我在什么地方读过一些东西,但我记不清了。我正在使用directshow在C++中编程。据我所知,directshow不会这么做。然后我研究了CBaseFilter,streamtime方法等,但在我深入到这个复杂的主题之前,我想知道这是不是正确的方法。期待您的回复,谢谢!
@ 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查找vid。我也尝试了帧步进(因此上面的参考文献)。
发布于 2013-02-08 23:14:40
DirectShow能够提供帧精确寻道。但是,如果没有索引,这将基于距文件开始的时间偏移量,而不是帧计数。
使用IMediaSeeking设置开始时间。多路分解器将在此之前开始传送压缩帧。解码器将从上一个关键帧开始解码,但将丢弃所选起始点之前的所有帧。
G
https://stackoverflow.com/questions/14755980
复制相似问题