我要写一个堆叠软件。因此,我希望将一个或多个视频文件的帧提取到opencl缓冲区中,然后使用opencl kernel处理它们。
但我不知道如何加载视频帧,因为我从未处理过视频。当我使用opencl时,我的主要关注点显然是高性能!
我知道有像ffmpeg或opencv之类的库,但是由于我对它不感兴趣,我不知道哪一个最适合我的需求。
那么,您能给我建议使用哪个库/函数与opencl结合使用哪个库/函数工作得最好(最快)?
我还没找到有用的东西。我从哪里开始呢?(像一个简短的推荐信或教程之类的东西会很好)
提前感谢!
我在Linux下工作(跨平台并不需要),我的(首选)编程语言是c++。我更喜欢h264作为视频格式,但是avi,mov,mp4,.也有可能。
发布于 2014-01-07 22:45:34
我的一位朋友很高兴在OpenGL的图像处理框架中使用ffmpeg,所以OpenCL也不应该有任何问题。我会选择这个,而不是一个特定于供应商的图书馆。如果您使用OpenCV,那么请记住,您的应用程序可能必须随OpenCV共享库一起提供,即使它不需要所有额外的东西,即在用户的计算机上浪费HDD空间。大约两年前,我发现ffmpeg很容易使用。
使用OpenCV在帧中读取的唯一原因是如果您还需要它的一些图像处理功能。如果没有,我会用ffmpeg。
发布于 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
发布于 2014-01-28 19:49:02
FFmpeg可能是正确的选择,它有很多低级别的优化&运行速度非常快。
在ffmpeg示例中可以找到最简单的解码应用程序:8c-example.html。
看看函数decode_write_frame()。解码后的图片存储在结构AVFrame中:(为了分配mem对象,我添加了一个参数- OpenCL上下文)
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和其他编码器进行编码。
https://stackoverflow.com/questions/20953729
复制相似问题