AVCodec YUV转RGB

4

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

这是我的代码:

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函数时崩溃。

VideoFrame是一个AVFrame结构体,用于保存解码后的帧。

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

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。

请帮助我解决这个问题,谢谢:)

1个回答

1
av_frame_alloc只分配帧对象本身的内存,不会分配用于存储图像数据的内存。在调用avpicture_fill之前,在您的代码中是否已经执行了以下操作:FillVect.resize( avpicture_get_size( PIX_FMT_RGB24, FrameWidth, FrameHeight ) );或其他方式来确保FillVect分配了足够的内存来保留整个解码图片?您是否尝试在valgrind下运行它,以查看到底是什么触发了SEGFAULT?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接