avcodec YUV到RGB

时间:2014-07-26 10:45:04

标签: c++ ffmpeg rgb yuv avcodec

我正在尝试使用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函数上执行SEGFAULT。

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数据被组合在一起)。 所以,我不知道如何使用swscale转换我的数组,其中Y,U,V数据被分成RGB24。

请帮助我,谢谢:)

1 个答案:

答案 0 :(得分:1)

av_frame_alloc仅为帧对象本身分配内存,它不分配内存来存储图像数据。你做完了吗?

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

在调用avpicture_fill之前,

代码中的某处?或者其他一些方法来确保FillVect分配足够的内存来保存整个解码图片?

您是否尝试在valgrind下运行它以查看究竟是什么触发了SEGFAULT?