我想打开一个小视频文件并映射内存中的每个帧(以应用一些自定义过滤器).我不想处理视频编解码器,我宁愿让库为我处理.
我尝试使用SampleGrabber过滤器使用Direct Show(使用此示例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链接似乎不起作用(请参阅错误)
目前,这些是Win32平台上最流行的视频框架:
Video for Windows:旧的Windows框架来自Win95时代,但仍然被广泛使用,因为它使用起来非常简单.不幸的是,它只支持安装了正确的VFW编解码器的AVI文件.
DirectShow:标准的WinXP框架,它基本上可以加载你可以用Windows Media Player播放的所有格式.相当难以使用.
Ffmpeg:更准确地说是Favmpeg开源多媒体实用程序附带的libavcodec和libavformat.它非常强大,即使您没有在系统上安装编解码器,也可以读取很多格式(几乎所有可以用VLC播放的格式).它使用起来相当复杂,但你总能受到随附的ffplay代码或开源软件中的其他实现的启发.无论如何,我认为它比DS更容易使用(并且更快).它需要由MinGW在Windows上进行编辑,但所有步骤都在这里得到了很好的解释(此时链接已关闭,希望不会死).
QuickTime:Apple框架不是Windows平台的最佳解决方案,因为它需要安装QuickTime应用程序以及适用于每种格式的QuickTime编解码器; 它不支持多种格式,但在专业领域很常见(所以有些编解码器实际上只适用于QuickTime).不应该太难实施.
Gstreamer:最新的开源框架.我不太了解它,我猜它包裹了一些其他系统(但我不确定).
除了DirectShow之外,所有这些框架都已在OpenCv Highgui中作为后端实现.Win32 OpenCV的默认框架是使用VFW(因此只能打开一些AVI文件),如果你想使用其他的,你必须下载CVS而不是正式版本,并且仍然对代码进行一些黑客攻击,无论如何不是太完整了,例如FFMPEG后端不允许在流中寻找.如果您想将QuickTime与OpenCV一起使用,这可以帮助您.