我想打开一个小视频文件,并映射内存中的每一帧(以应用一些自定义过滤器)。我不想处理视频编解码器,我宁愿让库为我处理它。
我尝试使用带有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)
发布于 2008-09-01 14:53:39
目前,以下是Win32平台上最流行的视频框架:
windows的
除了DirectShow之外,所有这些框架都在OpenCv Highgui中作为后端实现。Win32 OpenCV的默认框架是使用VFW (因此只能打开一些AVI文件),如果你想使用其他文件,你必须下载CVS而不是官方版本,并且仍然在代码上做一些黑客操作,而且它无论如何都不太完整,例如FFMPEG后端不允许在流中查找。如果您想在OpenCV中使用QuickTime,this可以帮助您。
发布于 2008-09-01 13:59:41
我已经使用OpenCV加载视频文件并对其进行处理。它对许多类型的视频处理也很方便,包括对计算机视觉有用的视频处理。
发布于 2008-09-01 15:16:10
使用SampleGrabber的“回调”模型可能会得到更好的结果。请参阅Samples\C++\DirectShow\Editing\GrabBitmaps中的示例。
在Samples\C++\DirectShow\Filters\Grabber2\grabber_text.txt和readme.txt中也有很多信息。
https://stackoverflow.com/questions/37956
复制相似问题