编解码(1)之基本像素格式转换 后面会适当更新记录

今天项目中发现以前移过来的代码 有转BGR24到NV12的代码 一堆for 还用了opencv  的cvtColor最后还是图像绘框还有问题 琢磨不透,果断用ffmpeg的一套swscale神器来搞了,效率还不差。

主要模式两个函数的理解

被转frame   目标frame

struct SwsContext* swsCtx = sws_getContext(pYUV420->width, pYUV420->height,pYUV420->format,
          pBGR24->width, pBGR24->height,pBGR24->format, SWS_AREA, NULL, NULL, NULL);
    sws_scale(swsCtx, pYUV420->data, pYUV420->linesize, 0,pYUV420->height,
          pBGR24->data, pBGR24->linesize);

举一反三解决AVframe 转AVframe的格式

YUV420转BGR24

void YUV420pToBGR24(AVFrame* pYUV420, AVFrame* pBGR24)
{/*通常在外面定义创建[下面仅供理解pYUV420]*///AVFrame* pYUV420 = av_frame_alloc();//pYUV420->format = AV_PIX_FMT_YUV420P;//av_frame_get_buffer(pYUV420, 1);//memcpy(pYUV420->data[0], buff, buffSize);/*通常在外面定义创建[下面仅供理解pBGR24]*///AVFrame* pBGR24 = av_frame_alloc();//pBGR24->format = AV_PIX_FMT_BGR24;//av_frame_get_buffer(pBGR24, 1);/*设置转码参数调用ffmpeg 转换*/struct SwsContext* swsCtx = sws_getContext(pYUV420->width, pYUV420->height,(AVPixelFormat)pYUV420->format, pBGR24->width, pBGR24->height, (AVPixelFormat)pBGR24->format, SWS_AREA, NULL, NULL, NULL);sws_scale(swsCtx, pYUV420->data, pYUV420->linesize, 0, pYUV420->height, pBGR24->data, pBGR24->linesize);if (swsCtx)sws_freeContext(swsCtx);/*通常在外面释放*///av_frame_unref(pYUV420);//av_frame_free(&pYUV420);//pYUV420 = NULL;//av_frame_unref(pBGR24);//av_frame_free(&pBGR24);//pBGR24 = NULL;
}

BGR24反转 YUV420

void BGR24ToYUV420p(AVFrame* pBGR24, AVFrame* pYUV420)
{/*设置转码参数调用ffmpeg 转换*/struct SwsContext* swsCtx = sws_getContext(pBGR24->width, pBGR24->height,(AVPixelFormat)pBGR24->format, pYUV420->width, pYUV420->height,(AVPixelFormat)pYUV420->format, SWS_AREA, NULL, NULL, NULL);sws_scale(swsCtx, pBGR24->data, pBGR24->linesize, 0, pBGR24->height,pYUV420->data, pYUV420->linesize);if (swsCtx)sws_freeContext(swsCtx);
}

BGR的数据流转YUV420数据流

void BGR2YUV(uint8_t* bgr24, int width, int height, uint8_t* yuv420p)
{//bgr24和yuv420p指针数据由外面创建维护AVFrame* pBGR24 = av_frame_alloc();pBGR24->format = AV_PIX_FMT_BGR24;pBGR24->width = width;pBGR24->height = height;av_frame_get_buffer(pBGR24, 1);memcpy(pBGR24->data[0], bgr24, width * height * 3);         //计算大小拷贝//待转换的格式AVFrame* pYUV = av_frame_alloc();pYUV->format = AV_PIX_FMT_YUV420P;pYUV->width = width;pYUV->height = height;av_frame_get_buffer(pYUV, 1);//设置转码参数struct SwsContext* swsCtx = sws_getContext(pBGR24->width, pBGR24->height, (AVPixelFormat)pBGR24->format, pYUV->width, pYUV->height, (AVPixelFormat)pYUV->format, SWS_AREA, NULL, NULL, NULL);sws_scale(swsCtx, pBGR24->data, pBGR24->linesize, 0, pBGR24->height, pYUV->data, pYUV->linesize);memcpy(yuv420p, pYUV->data[0], width * height * 3 / 2);    //计算大小拷贝if (swsCtx)sws_freeContext(swsCtx);av_frame_unref(pBGR24);av_frame_free(&pBGR24);av_frame_unref(pYUV);av_frame_free(&pYUV);
}

其他的格式可以参考AVPixelFormat用到的宏以及图像的大小空间的分配。

举一反三 就好解决了

编解码(1)之基本像素格式转换相关推荐

  1. ffmpeg + cuda(cuvid) 硬解码+像素格式转换(cpu主导)实战

    注意: VAAPI 是inter gpu 提供的硬编解码接口 VDPAU 是 video decode present api for unix nvdec / ncvid 都是nivida产出的硬解 ...

  2. FFmpeg 像素格式转换和尺寸转换

    Demo FFmpeg 可以实现像素格式转换和尺寸转换,但是性能开销非常大,对视频帧率影响比较大,实际开发中最好用 Shader来实现,FFmpeg的优势转换接口比较简单. 像素格式转换上下文 Sws ...

  3. qsv的像素格式转换

    av_hwframe_transfer_data 一种方法: AVFrame *src_frame, *dst_frame; AVPixelFormat src_fmt, dst_fmt; //设置源 ...

  4. FFmpeg视频像素格式转换和尺寸转换

    优缺点 相比openGL shader转换来说,ffmpeg转换相对简单,但是效率相对较低 函数 1> sws_getContext:获取上下文 2> sws_getCachedConte ...

  5. sws_scale像素格式转换RGBA转YUV420P

    FFmpeg 像素格式和尺寸转换函数 双线性过滤(Bilinear_filtering) 代码 test_sws_scale.cpp #include <iostream> #includ ...

  6. Opencv(4) RGB, YUV, GRAY像素格式介绍opencv像素格式转换cvtColor接口

    像素格式和灰度图 RGB: RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道的 ...

  7. 解码(六):sws_scale像素格式转换代码演示

    如下代码: if (vctx){if (!rgb)rgb = new unsigned char[frame->width*frame->height * 4];uint8_t *data ...

  8. android lame wav 转 mp3,Android JNI Lame编解码实现wav到MP3的转换

    1.JNI简介 JNI全称为Java Native Interface(JAVA本地调用).从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C ...

  9. android lame wav 转 mp3,Android JNI Lame编解码实现wav到MP3的转换

    1.JNI简介 JNI全称为Java Native Interface(JAVA本地调用).从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C ...

最新文章

  1. SQL Server2008(二)各版本的功能和主要应用范围
  2. 元素的高度(基于vue)
  3. R开发(part7)--环境空间
  4. git reset后本地拉取_一份值得收藏的 Git 异常处理清单
  5. 飞信linux下载文件,OpenFetion(飞信for Linux)
  6. 硬件描述语言复习笔记
  7. 32岁被裁补偿N+2:“感谢裁我,让我翻倍!” 网友:求同款被裁!
  8. [转载] spring mvc自定义int枚举转换器
  9. python的认识_认识Python和基础知识
  10. sql初学者指南_初学者SQL示例:SQL SELECT语句的用法
  11. 1.vue前端项目实战-登录功能
  12. 使用Atmel Studio7和USBasp烧写器烧写AVR单片机
  13. 比勤奋更能决定人生的,是复利思维
  14. 上市公司环境数据集:环境绩效明细表、排放明细表、资源消耗明细表等多项指标数据
  15. android 方向传感器应用
  16. HBASE学习使用经验
  17. H5 iOS 自动调起软键盘
  18. 双软认证企业税收优惠政策
  19. python hook pc微信_一起来用python玩一波微信呀 | 防撤回, 好友分析, 聊天机器人~...
  20. 最全的硬盘修复专题帖(转贴)

热门文章

  1. 空指针异常可能出现的原因
  2. <<视觉问答>>2021:Check It Again: Progressive Visual Question Answering via Visual Entailment
  3. 微信小程序web-view与H5 通信方式探索
  4. 干货!网络推断与数据驱动的影响力最大化问题
  5. 华为路由器负载均衡_华为OSPF路由负载分担配置示例
  6. 添加https证书信任
  7. 《鸟哥的Linux私房菜》Chapter11 20180726~20180806
  8. 学习Python可以做什么工作?选哪些工作方向?
  9. 加速应用开发 | Firebase Summit 2021 精彩回顾
  10. 华为无线网代理服务器端口是什么意思,华为ES1D2G48SFA0 48端口十兆/百兆/千兆以太网电接口板(FA,RJ45) (适用于华为S7700系列交换机)...