我想打开一个小视频文件并映射内存中的每个帧(以应用一些自定义滤镜)。我不想处理视频编解码器,而是希望库为我自己处理。
我尝试将Direct Show与SampleGrabber过滤器一起使用(使用此示例http://msdn.microsoft.com/en-us/library/ms787867(VS.85).aspx),但是我仅设法抓取了一些帧(并非每帧!)。我在视频软件编程方面还很陌生,也许我没有使用最好的库,或者我做错了。
我已经粘贴了部分代码(主要是msdn示例中的修改后的复制/粘贴),不幸的是,它没有按预期抓取前25帧...
[...]
hr = pGrabber->SetOneShot(TRUE);
hr = pGrabber->SetBufferSamples(TRUE);
pControl->Run(); // Run the graph.
pEvent->WaitForCompletion(INFINITE, &evCode); // Wait till it's done.
// Find the required buffer size.
long cbBuffer = 0;
hr = pGrabber->GetCurrentBuffer(&cbBuffer, NULL);
for( int i = 0 ; i < 25 ; ++i )
{
pControl->Run(); // Run the graph.
pEvent->WaitForCompletion(INFINITE, &evCode); // Wait till it's done.
char *pBuffer = new char[cbBuffer];
hr = pGrabber->GetCurrentBuffer(&cbBuffer, (long*)pBuffer);
AM_MEDIA_TYPE mt;
hr = pGrabber->GetConnectedMediaType(&mt);
VIDEOINFOHEADER *pVih;
pVih = (VIDEOINFOHEADER*)mt.pbFormat;
[...]
}
[...]
是否有一些具有视频软件经验的人可以为我提供有关代码或其他更简单库的建议?
谢谢
编辑:
msdn链接似乎不起作用(see the bug)
最佳答案
当前,这些是Win32平台上最流行的视频框架:
除DirectShow外,所有这些框架都已在OpenCv Highgui中作为后端实现。 Win32 OpenCV的默认框架使用的是VFW(因此只能打开一些AVI文件),如果要使用其他框架,则必须下载CVS而不是官方版本,并且仍然会对代码进行一些修改,但是无论如何太完整了,例如FFMPEG后端不允许在流中查找。
如果您想将QuickTime与OpenCV一起使用,this可以为您提供帮助。
关于c++ - C++ : What's the easiest library to open video file,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37956/