【问题标题】:Simple frame by frame video decoder library简单的逐帧视频解码器库
【发布时间】:2010-09-22 15:34:24
【问题描述】:

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

我知道 FFMPEG,但它需要使用数据包和类似的东西,我很惊讶在网上找不到允许类似的库:

视频 v = openVideo("路径"); uchar* 数据 = v.getFrame(); v.nextFrame();

我只需要提取视频的帧以将其用作纹理...之后无需重新编码或其他任何事情...

当然,可以读取最多格式的东西会很棒,例如基于 libavcodec 构建的东西;p

我使用的是 Windows 7

谢谢!

【问题讨论】:

  • libavcodec 是 ffmpeg 项目的一部分。

标签: c++ c video codec


【解决方案1】:

这是一个使用 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_&lt;unsigned char&gt; 本质上是一个字节数组。如果您真的需要明确类型为 unsigned char * 的东西,那么您可以分配适当大小的空间并使用

遍历矩阵

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

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

  • 这意味着整个图像必须在内存中占据一个连续空间。这在处理大图像时很重要
  • 它需要提交一定的数据顺序(像素与非平面 - RGB 平面是分散存储还是单独存储?)并降低了灵活性
  • 取消引用指针会导致错误(缓冲区溢出等)。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我搜索这个问题正是因为我正在寻找 DirectShow 的替代品。是跨平台的吗?它可以开箱即用地播放奇怪的格式吗?嗯,不是吗?我会检查 free-codecs.com 网站,看看我是否可以停止收到“pSampleGrabber->GetConnectedMediaType failed”......如果有帮助,我什至可以支持这个答案。因为我需要的一定不是 OpenCV。
      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 2017-12-13
      相关资源
      最近更新 更多