我想打开一个小视频文件并映射内存中的每个帧(以应用一些自定义滤镜)。我不想处理视频编解码器,而是希望库为我自己处理。

我尝试将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平台上最流行的视频框架:

  • Windows视频:来自Win95的旧Windows框架,但由于使用非常简单而仍被广泛使用。不幸的是,它仅支持已安装正确VFW编解码器的AVI文件。
  • DirectShow:标准的WinXP框架,它基本上可以加载Windows Media Player可以播放的所有格式。相当难用。
  • Ffmpeg:更确切地说是Ffmpeg开源多媒体实用程序随附的libavcodec和libavformat。它非常强大,即使您未在系统上安装编解码器,也可以读取许多格式(几乎可以使用VLC播放的所有内容)。它使用起来非常复杂,但是您总是可以从它附带的ffplay代码或开源软件中的其他实现中获得启发。无论如何,我认为它仍然比DS容易使用(并且速度更快)。它必须由Windows上的MinGW来处理,但是here很好地解释了所有步骤(此刻链接已断开,希望不会死)。
  • QuickTime:Apple框架不是Windows平台的最佳解决方案,因为它需要安装QuickTime应用程序以及每种格式的正确QuickTime编解码器;它不支持多种格式,但是在专业领域却很常见(因此某些编解码器实际上仅用于QuickTime)。实现起来应该不会太困难。
  • Gstreamer:最新的开源框架。我对此了解不多,我想它会覆盖其他一些系统(但我不确定)。

  • 除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/

    10-08 22:50