只要开始初始化一次,结束后释放就好,中间可以循环转码

  1. AVFrame *m_pFrameRGB,*m_pFrameYUV;
  2. uint8_t *m_rgbBuffer,*m_yuvBuffer;
  3. struct SwsContext *m_img_convert_ctx;
  4.  
  5. void init() //分配两个Frame,两段buff,一个转换上下文
  6. {
  7.  //为每帧图像分配内存
  8. m_pFrameYUV = av_frame_alloc();
  9. m_pFrameRGB = av_frame_alloc();
  10.  
  11. // width和heigt为传入的分辨率的大小,分辨率有变化时可以以最大标准申请
  12. int numBytes = avpicture_get_size(AV_PIX_FMT_RGB32, nwidth,nheight);
  13. m_rgbBuffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));
  14. int yuvSize = nwidth * nheight * /;
  15. m_yuvBuffer = (uint8_t *)av_malloc(yuvSize);
  16. //特别注意sws_getContext内存泄露问题,
  17. //注意sws_getContext只能调用一次,在初始化时候调用即可,另外调用完后,在析构函数中使用sws_freeContext,将它的内存释放。
  18. //设置图像转换上下文
  19. m_img_convert_ctx = sws_getContext(nwidth, nheight, AV_PIX_FMT_YUV420P, \
  20.                         nwidth, nheight, AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL);
  21. }
  22.  
  23. void playchar* pbuff_in,int nwidth,int nheight
    {
  24. avpicture_fill((AVPicture *) m_pFrameRGB, m_rgbBuffer, AV_PIX_FMT_RGB32,nwidth, nheight);
  25. avpicture_fill((AVPicture *) m_pFrameYUV, (uint8_t *)pbuff_in, AV_PIX_FMT_YUV420P, nwidth, nheight);
  26. //转换图像格式,将解压出来的YUV420P的图像转换为RGB的图像
  27. sws_scale(m_img_convert_ctx,
  28. (uint8_t const * const *) m_pFrameYUV->data,
  29. m_pFrameYUV->linesize, , nheight, m_pFrameRGB->data,
  30. m_pFrameRGB->linesize);
  31. //把这个RGB数据 用QImage加载
  32. QImage tmpImg((uchar *)m_rgbBuffer,nwidth,nheight,QImage::Format_RGB32);
  33. //把图像复制一份 传递给界面显示
  34. m_mapImage[nWindowIndex] = tmpImg.copy();
  35. }
  36.  
  37. void release()
  38. {
  39. av_frame_free(&m_pFrameYUV);
  40. av_frame_free(&m_pFrameRGB);
  41. av_free(m_rgbBuffer);
  42. av_free(m_yuvBuffer);
  43. sws_freeContext(m_img_convert_ctx);
  44. }
  1. bool YV12ToBGR24_FFmpeg(unsigned char* pYUV,unsigned char* pBGR24,int width,int height)
  2. {
  3. if (width < || height < || pYUV == NULL || pBGR24 == NULL)
  4. return false;
  5. //int srcNumBytes,dstNumBytes;
  6. //uint8_t *pSrc,*pDst;
  7. AVPicture pFrameYUV,pFrameBGR;
  8.  
  9. //pFrameYUV = avpicture_alloc();
  10. //srcNumBytes = avpicture_get_size(PIX_FMT_YUV420P,width,height);
  11. //pSrc = (uint8_t *)malloc(sizeof(uint8_t) * srcNumBytes);
  12. avpicture_fill(&pFrameYUV,pYUV,PIX_FMT_YUV420P,width,height);
  13.  
  14. //U,V互换
  15. uint8_t * ptmp=pFrameYUV.data[];
  16. pFrameYUV.data[]=pFrameYUV.data[];
  17. pFrameYUV.data []=ptmp;
  18.  
  19. //pFrameBGR = avcodec_alloc_frame();
  20. //dstNumBytes = avpicture_get_size(PIX_FMT_BGR24,width,height);
  21. //pDst = (uint8_t *)malloc(sizeof(uint8_t) * dstNumBytes);
  22. avpicture_fill(&pFrameBGR,pBGR24,PIX_FMT_BGR24,width,height);
  23.  
  24. struct SwsContext* imgCtx = NULL;
  25. imgCtx = sws_getContext(width,height,PIX_FMT_YUV420P,width,height,PIX_FMT_BGR24,SWS_BILINEAR,,,);
  26.  
  27. if (imgCtx != NULL){
  28. sws_scale(imgCtx,pFrameYUV.data,pFrameYUV.linesize,,height,pFrameBGR.data,pFrameBGR.linesize);
  29. if(imgCtx){
  30. sws_freeContext(imgCtx);
  31. imgCtx = NULL;
  32. }
  33. return true;
  34. }
  35. else{
  36. sws_freeContext(imgCtx);
  37. imgCtx = NULL;
  38. return false;
  39. }
  40. }

另一种方法:

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

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

    video的raw data一般都是YUV420p的格式,简单的记录下这个格式的细节,如有不对希望大家能指出.   YUV图像通常有两种格式,一种是packet 还有一种是planar    从字面上 ...

  2. JavaCV FFmpeg采集摄像头YUV数据

    前阵子使用利用树莓派搭建了一个视频监控平台(传送门),不过使用的是JavaCV封装好的OpenCVFrameGrabber和FFmpegFrameRecorder. 其实在javacpp项目集中有提供 ...

  3. ffmpeg从AVFrame取出yuv数据到保存到char*中

    ffmpeg从AVFrame取出yuv数据到保存到char*中   很多人一直不知道怎么利用ffmpeg从AVFrame取出yuv数据到保存到char*中,下面代码将yuv420p和yuv422p的数 ...

  4. Android camera2 回调imagereader 从Image拿到YUV数据转化成RGB,生成bitmap并保存

    ImageUtil.java import android.graphics.ImageFormat; import android.media.Image; import android.os.Bu ...

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

    有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的. ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码,所以YUV数据有两种:  解码后的YUV数据, 以及  编码重建的YUV ...

  6. FFMPEG学习----分离视频里的H.264与YUV数据

    #include <stdio.h> extern "C" { #include "libavcodec/avcodec.h" #include & ...

  7. 入门视频采集与处理(学会分析YUV数据)

    做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...

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

    在Android上用OpenGLES来显示YUV图像,之所以这样做,是因为: 1.Android本身也不能直接显示YUV图像,YUV转成RGB还是必要的: 2.YUV手动转RGB会占用大量的CPU资源 ...

  9. 学会分析YUV数据

    做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...

随机推荐

  1. Scala学习(八)练习

    Scala中继承&练习 1. 扩展如下的BankAccount类,新类CheckingAccount对每次存款和取款都收取1美元的手续费 class BankAccount ( initial ...

  2. OM1、OM2、OM3和OM4光纤之间的区别

    “OM”stand for optical multi-mode,即光模式,是多模光纤表示光纤等级的标准.不同等级传输时的带宽和最大距离不同,从以下几个方面分析它们之间的区别.  一.OM1.OM2. ...

  3. 修改docker0默认IP地址

    第一步:vim /etc/docker/daemon.json { "registry-mirrors": ["https://docker.mirrors.ustc.e ...

  4. getQueryStringByName url参数/

    MasterId: (masterIdUrl != null && masterIdUrl != "") ? masterIdUrl : null ClassId: ...

  5. 关于对于system函数和c++标准下的新的变量定义方式{}

  6. 牛客练习赛38 D 题 出题人的手环 (离散化+树状数组求逆序对+前缀和)

    链接:https://ac.nowcoder.com/acm/contest/358/D来源:牛客网 出题人的手环 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...

  7. iOS原生实现二维码拉近放大

    http://www.cocoachina.com/ios/20180416/23033.html 2018-04-16 15:34 编辑: yyuuzhu 分类:iOS开发 来源:程序鹅 8 300 ...

  8. HTTPS建立连接的过程

    HTTP建立连接的过程点击:HTTP三次握手.一次HTTP请求都发生了什么 一.HTTPS   HTTP是超文本传输协议.HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私 ...

  9. elasticsearch5.0版本的head安装

    elasticsearch5.0版本的head安装 elasticsearch5.0版本由于刚出不久,并且与2.0版本的差距较大.所以,目前大家对5.0的一些使用还有所陌生.这里先把关于head插件的 ...

  10. 使用Charles对iPhone进行Http(s)请求拦截(抓包)

    首先准备工具 1> Charles (下载对应操作系统的安装包进行安装,本文使用 macOS 进行演示) 2> iPhone (本文使用SE,系统版本:iOS 10) 开始 首先,对Cha ...