FFmpeg 将YUV数据转RGB

Posted nanqiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg 将YUV数据转RGB相关的知识,希望对你有一定的参考价值。

void init() //分配两个Frame,两段buff,一个转换上下文
{
 //为每帧图像分配内存
    m_pFrameYUV = av_frame_alloc();
    m_pFrameRGB = av_frame_alloc();
    int numBytes = avpicture_get_size(AV_PIX_FMT_RGB32, nwidth,nheight);
    m_rgbBuffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));
  // width和heigt为传入的分辨率的大小
    int yuvSize = nwidth * nheight * 3 /2;
    m_yuvBuffer = (uint8_t *)av_malloc(yuvSize);
    //特别注意sws_getContext内存泄露问题,
    //注意sws_getContext只能调用一次,在初始化时候调用即可,另外调用完后,在析构函数中使用sws_freeContext,将它的内存释放。
    //设置图像转换上下文
    m_img_convert_ctx = sws_getContext(nwidth, nheight, AV_PIX_FMT_YUV420P, 
                        nwidth, nheight, AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL); }
void play(char* pbuff_in,int nwidth,int nheight)
{
//这里的长度和高度跟之前保持一致
    avpicture_fill((AVPicture *) m_pFrameRGB, m_rgbBuffer, AV_PIX_FMT_RGB32,nwidth, nheight);
    avpicture_fill((AVPicture *) m_pFrameYUV, (uint8_t *)pbuff_in, AV_PIX_FMT_YUV420P, nwidth, nheight);
    //转换图像格式,将解压出来的YUV420P的图像转换为RGB的图像
    sws_scale(m_img_convert_ctx,
            (uint8_t const * const *) m_pFrameYUV->data,
            m_pFrameYUV->linesize, 0, nheight, m_pFrameRGB->data,
            m_pFrameRGB->linesize);
    //把这个RGB数据 用QImage加载
    QImage tmpImg((uchar *)m_rgbBuffer,nwidth,nheight,QImage::Format_RGB32);
     //把图像复制一份 传递给界面显示
    m_mapImage[nWindowIndex] = tmpImg.copy();
}

 


以上是关于FFmpeg 将YUV数据转RGB的主要内容,如果未能解决你的问题,请参考以下文章

如何把摄像头采集的rgb图像转成yuv格式,并进行H264硬编码?

将 RGB 转换为 YUV,+ ffmpeg

FFmpeg RGB转MP4

C语言实现BMP格式转RGB格式YUV格式

如何将rgb 模式转换成 yuv 模式

YUV 转 RGB 和 CreateBitmap ......格式是啥?