c++ - 使用 C++ 加载视频和抓取图像的最佳方式

标签 c++ visual-studio opencv ffmpeg directshow

我正在寻找一种快速加载视频文件并以特定时间间隔(每秒、每分钟、每小时等)从中创建图像的方法。

我尝试使用 DirectShow,但它运行得太慢,我无法启动视频文件并移动到某个位置以获取数据并将其保存到图像中。即使我禁用了引用时钟。尝试过 OpenCV,但它无法打开 AVI 文件,除非我知道确切的编解码器信息。因此,如果我知道从 OpenCV 中获取编解码器信息的方法,我可能会再试一次。我尝试使用 FFMPEG,但我无法像我希望的那样控制它。

如有任何建议,我们将不胜感激。这是在 Windows 机器上开发的,因为它必须托管在 Windows 机器上。

最佳答案

MPEG-4 格式不是帧内编码格式,因此您不能直接跳转到随机帧并自行解码,因为大多数帧只编码与一个或多个其他帧的差异。我怀疑你的解码速度很慢,因为当你到达一个帧时,首先要解码其他几个相关帧。

提高性能的一种方法是确定哪些帧是关键帧(或有时也称为“同步”点)并将解码限制在这些帧上,因为这些帧可以自行解码。

我不太熟悉 DirectShow 功能,但我希望它有一些 API 来公开同步点。

另外,我应该提到 Windows 上的 QuickTime SDK 可能是您解码电影帧的另一个不错的选择。您应该首先测试您的 AVI 电影是否可以在 QuickTime Player 中正确播放。并且 QT SDK 确实公开了同步点,请参阅部分 Finding Interesting Times在 QT SDK 文档中。

关于c++ - 使用 C++ 加载视频和抓取图像的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7448411/

相关文章:

c++ - 如何使用zeromq(zmq)在服务器和客户端之间发送整数值?

c++ - linux中的内存分配是非阻塞的吗?

visual-studio - TFS 2013自动构建: Is there a way to run the tests from the src folder

image - 如何使图像的不连续轮廓保持一致?

c++ - 为什么这样的 OpenAL 代码会在 Visual Studio 2008 中出现这样的错误?

c++ - 每像素照明黑点/奇怪的伪影

c++ - ifstream 给我带来麻烦

visual-studio-2010 - Visual Studio 无法再打开 css 文件

opencv - 更新dylib以引用其他dylib的正确版本(Homebrew)

qt - 在Qt Creator中无法使用OpenCV显示图像