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();
}

原文地址:https://www.cnblogs.com/nanqiang/p/10116279.html

时间: 2024-10-29 17:28:38

FFmpeg 将YUV数据转RGB的相关文章

ffmpeg最简单的解码保存YUV数据 <转>

video的raw data一般都是YUV420p的格式,简单的记录下这个格式的细节,如有不对希望大家能指出.   YUV图像通常有两种格式,一种是packet 还有一种是planar    从字面上就能理解packet的意思就是所有的yuv数据都是一股脑的放在一起,当然 内部的数据还是按照格式要求的,只是从外部来讲是一整个包包含了所有的yuv数据.最长见的YUV格式就是planar格式了.这个格式是讲yuv三个分量分别放在三个数组里.   如下图是个420p的格式图: YUV420格式是指,每

(转) 从ffmpeg中提取出YUV数据

有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的. ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码,所以YUV数据有两种:  解码后的YUV数据, 以及  编码重建的YUV数据.下面分别讲两个YUV数据从哪儿?以及如何取? 1. 解码后的YUV数据在ffmpeg/libavcodec/utils_codec.c的avcodec_decode_video2() 函数中: avcodec_decode_video2(...){  ...   ret = avctx->co

Android上使用OpenGLES2.0显示YUV数据

在Android上用OpenGLES来显示YUV图像,之所以这样做,是因为: 1.Android本身也不能直接显示YUV图像,YUV转成RGB还是必要的: 2.YUV手动转RGB会占用大量的CPU资源,如果以这样的形式播放视频,手机会很热,所以我们尽量让GPU来做这件事: 3.OpenGLES是Android集成到自身框架里的第三方库,它有很多的可取之处. 博主的C/C++不是很好,所以整个过程是在Java层实现的,大家见笑,我主要参考(但不限于)以下文章,十分感谢这些朋友的分享: 1. htt

Android用surface直接显示yuv数据

研究了一段时间Android的surface系统,一直执着地认为所有在surface或者屏幕上显示的画面,必须要转换成RGB才能显示,yuv数据也要通过颜色空间转换成RGB才能显示.可最近在研究stagefright视频显示时发现,根本找不到omx解码后的yuv是怎么转换成RGB的代码,yuv数据在render之后就找不到去向了,可画面确确实实的显示出来了,这从此颠覆了yuv必须要转换成RGB才能显示的真理了. 稍微看一下AsomePlayer的代码,不难发现,视频的每一帧是通过调用了Softw

多媒体基础知识之YUV数据

1.什么是YUV格式 YUV,是一种颜色编码方法.Y表示明亮度(Luminance.Luma),也就是灰度值.U和V则是色度.浓度(Chrominance.Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色.与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题.并且,YUV不像RGB那样要求三个独立的视频信

YUV 格式与 RGB 格式的相互转换公式及C++ 代码

YUV 格式与 RGB 格式的相互转换公式 最近在用的一个工业相机,输出的图像格式是 YUY2 格式.而在电脑上显示时需要 RGB 格式,所以就花了些时间在网上查了些相关的资料.说实话,网上关于 YUV 与 RGB 格式变换的文章挺多的,本来不需要我再多写这么一篇.但是网上那些文章中给出了各种各样的变换公式,公式的系数又各不相同,让人看了之后越看越糊涂.其实那些文章的公式基本都是对的,只不过因为作者忘记给出变换公式的定义域与值域,所以给读者使用造成了很大的麻烦. 为此我就写了这篇文章,来梳理一下

YUV格式转换为RGB(基于opencv)

之前写代码过程中需要将YUV格式视频中每帧提取出来,然后保存为图片.网上普遍有两种方法,第一种是通过opencv自带cvCvtColor,但是这种方法有bug,得到的图片会泛白.第二种方法是公式法. 法一:opencv自带cvCvtColor 说明:这种方法会出现图片"泛白",具体原因网上是说cvCvtColor这个函数左右协议不同,不太懂. 代码: void FileWriteFrames(){ char *filename = "E:\\openCV\\zhang\\yu

YUV数据详解

http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html YUV格式有两大类:planar和packed.对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V.对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的. YUV,分为三个分量,"Y"表示明亮度(Luminance或Luma),也就是灰度值:而"U"和"V&quo

YUV格式转换RGB(基于opencv)

在编写代码将需要处理YUV格从每个视频帧中提取,然后将其保存为图片.有两种常见的方法在线,第一种是通过opencv自带cvCvtColor,可是这样的方法有bug.得到的图片会泛白.另外一种方法是公式法. 法一:opencv自带cvCvtColor 说明:这样的方法会出现图片"泛白".详细原因网上是说cvCvtColor这个函数左右协议不同,不太懂. 代码: void FileWriteFrames(){ char *filename = "E:\\openCV\\zhang