【问题标题】:avcodec YUV to RGBavcodec YUV 转 RGB
【发布时间】:2014-09-18 03:52:16
【问题描述】:

我正在尝试使用 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 的数组转换为 RGB24。

请帮助我,谢谢:)

【问题讨论】:

    标签: c++ ffmpeg rgb yuv avcodec


    【解决方案1】:

    av_frame_alloc 只为框架对象本身分配内存,它不分配内存来存储图像数据。你完成了吗:

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

    在调用avpicture_fill 之前在您的代码中的某个位置?或者其他方式来确保 FillVect 分配足够的内存来保存整个解码的图片?

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

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 2014-01-25
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2012-05-20
      • 2011-02-01
      • 2012-09-10
      相关资源
      最近更新 更多