简单的逐帧视频解码器库

发布于 2024-09-24 11:39:05 字数 339 浏览 1 评论 0原文

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

我知道 FFMPEG,但它需要使用数据包和类似的东西,令我惊讶的是,在网上我找不到一个允许类似以下内容的库:

Video v = openVideo("path"); uchar* 数据 = v.getFrame(); v.nextFrame();

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

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

我正在使用 Windows 7

谢谢!

I'm looking for a simple c/c++ lib that would allow to extract the first frame of a video as a uchar array. And have a simple fonction to access the next one.

I know of FFMPEG but it requiere to play with packet and things like that, and i'm surprised that nowhere on the net i can find a lib that allow something like :

Video v = openVideo("path");
uchar* data = v.getFrame();
v.nextFrame();

I just need to extract frames of a video to use it as a texture...no need for reencoding after or anything...

of course something that would read the most format than possible would be great, something built upon libavcodec for example ;p

And i'm using Windows 7

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

相守太难 2024-10-01 11:39:05

这是 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 *的内容,那么您可以分配适当大小的空间并使用

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

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

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

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

Here's an example with 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;
}

It's untested, but I cannibalized it from some existing working code, so it shouldn't take you long to get it working.

The cv::Mat_<unsigned char> is essentially a byte array. If you really need something that's explicitly of type unsigned char *, then you can malloc space of the appropriate size and iterate over the matrix using

You can convert a cv::Mat to a byte array using pixel positions(cv::Mat_::at()) or iterators (cv::Mat_::begin() and friends).

There are many reasons why libraries rarely expose image data as a simple pointer, such as:

  • It implies the entire image must occupy a contiguous space in memory. This is a big deal when dealing with large images
  • It requires committing a certain ordering of the data (pixel vs non-planar -- are the RGB planes stored interspersed or separately?) and reduces flexibility
  • Dereferencing pointers is a cause for bugs (buffer overruns, etc).

So if you want your pointer, you have to do a bit of work for it.

心房的律动 2024-10-01 11:39:05

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

You can use OpenCV it is very simple and they have a useful manual on their site http://opencv.willowgarage.com/wiki/

凡间太子 2024-10-01 11:39:05

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

Use DirectShow. Here's an article: http://www.codeproject.com/KB/audio-video/framegrabber.aspx
There are DirectShow 'add-ons' to decode different video formats. Here's one of the sites where you can grab free DirectShow filter packs to decode some common formats that are not directly supported by DirectShow: http://www.free-codecs.com/download/DirectShow_FilterPack.htm

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文