简单的逐帧视频解码器库

时间:2010-09-22 15:34:25

标签: c++ c video codec

我正在寻找一个简单的c / c ++ lib,它允许将视频的第一帧作为uchar数组提取。并且有一个简单的功能来访问下一个。

我知道FFMPEG,但它需要使用数据包和类似的东西,我很惊讶网上没有任何地方我可以找到一个允许类似的内容:

视频v = openVideo(“路径”); uchar * data = v.getFrame(); v.nextFrame();

我只需要提取视频的帧以将其用作纹理......不需要重新编码后或其他任何内容......

当然,阅读格式最多的东西会很棒,例如建立在libavcodec上的东西; p

我正在使用Windows 7

谢谢!

3 个答案:

答案 0 :(得分:3)

这是OpenCV的一个例子:

#include <cv.h>
#include <highgui.h>

int
main(int argc, char **argv)
{       
    cv::VideoCapture capture(argv[1]);
    if (capture.grab())
    {   
        cv::Mat_<char> frame;
        capture.retrieve(frame);
        //
        // Convert to your byte array here
        //
    }    
    return 0;
}

这是未经测试的,但是我从一些现有的工作代码中蚕食它,所以不应该花很长时间才能让它工作。

cv::Mat_<unsigned char>本质上是一个字节数组。如果您真的需要明确类型为unsigned char *的内容,那么您可以使用适当大小的malloc空间并使用

遍历矩阵

您可以使用像素位置(cv::Mat)或迭代器(cv::Mat_::at()和朋友)将cv::Mat_::begin()转换为字节数组。

图书馆很少将图像数据作为简单指针公开的原因有很多,例如:

  • 这意味着整个图像必须在内存中占据连续空间。处理大图像时这是一个大问题
  • 它要求提交一定数量的数据(像素与非平面 - 是散布或分开存储的RGB平面?)并降低灵活性
  • 取消引用指针是导致错误(缓冲区溢出等)的原因。

所以如果你想要你的指针,你必须为它做一些工作。

答案 1 :(得分:1)

您可以使用OpenCV,它非常简单,并且在他们的网站上有一本有用的手册http://opencv.willowgarage.com/wiki/

答案 2 :(得分:0)

使用DirectShow。这是一篇文章:http://www.codeproject.com/KB/audio-video/framegrabber.aspx 有DirectShow'附加组件'来解码不同的视频格式。这是一个可以获取免费DirectShow过滤包以解码DirectShow不直接支持的常见格式的网站之一:http://www.free-codecs.com/download/DirectShow_FilterPack.htm