C ++:最简单的打开视频文件的库是什么
我想打开一个小视频文件并映射内存中的每个帧(以应用一些自定义滤镜)。我不想处理视频编解码器,而是希望库为我自己处理。
我尝试将Direct Show与SampleGrabber过滤器一起使用(使用此示例http://msdn.microsoft.com/zh-cn/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链接似乎不起作用(请参见错误)
解决方案
回答
我已经使用OpenCV加载视频文件并进行处理。它对于许多类型的视频处理(包括那些对计算机视觉有用的视频处理)也很方便。
回答
尝试使用OpenCV库。它绝对具有我们需要的功能。
本指南包含有关从视频文件访问帧的部分。
回答
当前,这些是Win32平台上最流行的视频框架:
- Windows视频:旧的Windows框架来自Win95时代,但由于使用非常简单,因此仍被广泛使用。不幸的是,它仅支持已安装了正确的VFW编解码器的AVI文件。
- DirectShow:标准WinXP框架,它基本上可以加载Windows Media Player可以播放的所有格式。相当难用。
- Ffmpeg:更确切地说是Ffmpeg开源多媒体实用程序随附的libavcodec和libavformat。它非常强大,即使我们未在系统上安装编解码器,也可以读取许多格式(几乎可以用VLC播放的所有内容)。它的使用相当复杂,但是我们总是可以从它附带的ffplay代码或者开源软件中的其他实现中获得启发。无论如何,我认为它仍然比DS容易使用(并且速度更快)。它必须由Windows上的MinGW来处理,但是这里对所有步骤都进行了很好的解释(此刻链接已断开,希望不会死)。
- QuickTime:Apple框架不是Windows平台的最佳解决方案,因为它需要安装QuickTime应用程序以及每种格式的正确QuickTime编解码器;它不支持多种格式,但是在专业领域却很常见(因此某些编解码器实际上仅用于QuickTime)。实施起来应该不会太困难。
- Gstreamer:最新的开源框架。我对此了解不多,我想它会覆盖其他一些系统(但我不确定)。
除DirectShow外,所有这些框架都已在OpenCv Highgui中作为后端实现。 Win32 OpenCV的默认框架使用的是VFW(因此只能打开一些AVI文件),如果要使用其他框架,则必须下载CVS而不是官方版本,并且仍然会对代码进行一些修改,但是无论如何太完整了,例如FFMPEG后端不允许在流中查找。
如果要将QuickTime与OpenCV一起使用,可以为我们提供帮助。
回答
使用SampleGrabber的"回调"模型可能会给我们带来更好的结果。请参见Samples \ C ++ \ DirectShow \ Editing \ GrabBitmaps中的示例。
在Samples \ C ++ \ DirectShow \ Filters \ Grabber2 \ grabber_text.txt和readme.txt中也有很多信息。
回答
如果是用于AVI文件,我自己会从AVI文件中读取数据并提取帧。现在,使用视频压缩管理器对其进行解压缩。
AVI文件格式非常简单,请参见:http://msdn.microsoft.com/zh-cn/library/dd318187(VS.85).aspx(并使用google)。
打开文件后,只需提取每个帧并将其传递到ICDecompress()进行解压缩。
似乎需要做很多工作,但这是最可靠的方法。
如果工作量太大,或者我们想要的不只是AVI文件,请使用ffmpeg。
回答
如果视频仅需要产生一系列图片,则OpenCV是最佳解决方案。如果我们愿意进行真实的视频处理,那么ViDeo等于" Visual Audio",则需要跟上" martjno"提供的视频。同样适用于Win7的新的Windows解决方案还包括3种新的可能性:
- Windows Media Foundation:DirectShow的继承者;清理界面
- Windows Media Encoder 9:它不仅包含程序,还附带用于编码的库
- Windows Expression 4:2的后继。
最后两个是仅供商业使用的解决方案,但第一个是免费的。要编码WMF,我们需要安装Windows SDK。