首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCL视频处理

OpenCL视频处理
EN

Stack Overflow用户
提问于 2014-01-06 15:50:44
回答 3查看 2.3K关注 0票数 1

我要写一个堆叠软件。因此,我希望将一个或多个视频文件的帧提取到opencl缓冲区中,然后使用opencl kernel处理它们。

但我不知道如何加载视频帧,因为我从未处理过视频。当我使用opencl时,我的主要关注点显然是高性能

我知道有像ffmpegopencv之类的库,但是由于我对它不感兴趣,我不知道哪一个最适合我的需求。

那么,您能给我建议使用哪个库/函数与opencl结合使用哪个库/函数工作得最好(最快)?

我还没找到有用的东西。我从哪里开始呢?(像一个简短的推荐信或教程之类的东西会很好)

提前感谢!

我在Linux下工作(跨平台并不需要),我的(首选)编程语言是c++。我更喜欢h264作为视频格式,但是avimovmp4,.也有可能。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-07 22:45:34

我的一位朋友很高兴在OpenGL的图像处理框架中使用ffmpeg,所以OpenCL也不应该有任何问题。我会选择这个,而不是一个特定于供应商的图书馆。如果您使用OpenCV,那么请记住,您的应用程序可能必须随OpenCV共享库一起提供,即使它不需要所有额外的东西,即在用户的计算机上浪费HDD空间。大约两年前,我发现ffmpeg很容易使用。

使用OpenCV在帧中读取的唯一原因是如果您还需要它的一些图像处理功能。如果没有,我会用ffmpeg。

票数 0
EN

Stack Overflow用户

发布于 2014-01-06 16:43:05

如果您在Windows上使用AMD GPU,尝试使用。

来自SemiAcurate网站http://semiaccurate.com/2012/06/18/amd-media-sdk-announced-at-afds/

‘AMD的Media SDK。这个SDK的目标是通过API和代码示例公开AMD的固定功能硬件块和GPU加速功能。在竞争激烈的市场大背景下,AMD需要开发人员利用GPU中基于GPU的功能,以便GPU为一般计算负载提供切实的好处。为此,AMD正在准备示例应用程序,为开发人员在应用程序中使用创建API,并用指南和教程记录一切,作为创建此Media SDK的工作的一部分。

http://developer.amd.com/tools-and-sdks/heterogeneous-computing/media-sdk/

我认为它还在测试阶段,但是有一组例子。

http://amd.wpengine.com/app-sdk/codelisting.php?q=Media

票数 1
EN

Stack Overflow用户

发布于 2014-01-28 19:49:02

FFmpeg可能是正确的选择,它有很多低级别的优化&运行速度非常快。

在ffmpeg示例中可以找到最简单的解码应用程序:8c-example.html

看看函数decode_write_frame()。解码后的图片存储在结构AVFrame中:(为了分配mem对象,我添加了一个参数- OpenCL上下文)

代码语言:javascript
复制
static int decode_write_frame(
    const char     *outfilename, 
    AVCodecContext *avctx,
    AVFrame        *frame, 
    int            *frame_count, 
    AVPacket       *pkt, 
    int            last,
    cl_context     context)
{
    int len, got_frame;
    len = avcodec_decode_video2(avctx, frame, &got_frame, pkt);

    if (len < 0) {
        fprintf(stderr, "Error while decoding frame %d\n", *frame_count);
        return len;
    }

    cl_int ret_code;

    //frame->data[0] is Y plane
    cl_mem y_plane = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, 
        frame->width * frame->height, frame->data[0], &ret_code);

    if(ret_code != CL_SUCCESS){
        fprintf(stderr, "Error %d occured.\n", ret_code);
    }

    //frame->data[1] is Cb plane
    //frame->data[2] is Cr plane      
    //Remember, that video is usually encoded in YCbCr420, which means that
    //Cb & Cr planes are smaller than Y plane 2 times in each dimension

    if (pkt->data) {
        pkt->size -= len;
        pkt->data += len;
    }
    return 0;
}

不要混淆编解码器和容器。Avi或Mov容器可以存储比特流,它使用MPEG4、MPEG2和其他编码器进行编码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20953729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档