首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >avcodec YUV到RGB

avcodec YUV到RGB
EN

Stack Overflow用户
提问于 2014-07-26 10:45:03
回答 1查看 2.9K关注 0票数 4

我正在尝试使用libswscale将YUV帧转换为RGB。

这是我的代码:

代码语言:javascript
复制
AVFrame *RGBFrame;
SwsContext *ConversionContext;

ConversionContext = sws_getCachedContext(NULL, FrameWidth, FrameHeight, AV_PIX_FMT_YUV420P, FrameWidth, FrameHeight, AV_PIX_FMT_RGB24, SWS_BILINEAR, 0, 0, 0);
RGBFrame = av_frame_alloc();

avpicture_fill((AVPicture *)RGBFrame, &FillVect[0], AV_PIX_FMT_RGB24, FrameWidth, FrameHeight);

sws_scale(ConversionContext, VideoFrame->data, VideoFrame->linesize, 0, VideoFrame->height, RGBFrame->data, RGBFrame->linesize);

我的程序在sws_scale函数上做SEGFAULT。

VideoFrame是一个AVFrame结构,它保存着我的解码帧。

我认为这是因为YUV帧来自avcodec_decode_video2,它返回如下数组:

代码语言:javascript
复制
VideoFrame->data[0] // Y array, linesize = frame width
VideoFrame->data[1] // U array, linesize = frame width/2
VideoFrame->data[2] // V array, linesize = frame width/2

理论上,YUV420P只有一个平面(根据维基百科,YUV420P是一个平面格式,然后Y、U、V数据被组合在一起)。因此,我不知道如何继续转换我的数组,其中Y,U,V数据被分离成RGB24,使用swscale。

请帮助我,谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-28 00:11:44

av_frame_alloc只为帧对象本身分配内存,不为存储图像数据分配内存。你是否做过:

FillVect.resize( avpicture_get_size( PIX_FMT_RGB24, FrameWidth, FrameHeight ) );

在调用avpicture_fill之前在代码中的某个位置?或者其他一些方法,以确保FillVect分配足够的内存来保存整个解码图像?

你有没有试着在“英勇”下运行它,看看究竟是什么触发了SEGFAULT?

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

https://stackoverflow.com/questions/24970182

复制
相关文章

相似问题

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