本文介绍如何使用ffmpeg中的接口转换像素数据格式.

sws_scale()可以用于对视频原始数据的长宽进行转换, 或者转成别的格式
假定现有 yuv.yuv(YUV420P格式)文件需要转为RGBA格式
将rgb.rgb转成yuv格式

#include <iostream>
#include <fstream>
using namespace std;
extern "C"{#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
}
//预处理指令导入库
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avutil.lib")
#pragma comment(lib, "swscale.lib")#define YUV_FILE "yuv.yuv"
#define RGBA_FILE "rgb.rgb"#define YUV_WIDTH 400
#define YUV_HEIGHT 300#define RGB_WIDTH 800
#define RGB_HEIGHT 600int main()
{//1,申请3个用于存放yuv数据的数组 并设置好linesizeunsigned char *yuv[3];int yuv_linesize[3] = { YUV_WIDTH, YUV_WIDTH / 2, YUV_WIDTH / 2 };yuv[0] = new unsigned char[YUV_WIDTH * YUV_HEIGHT ];yuv[1] = new unsigned char[YUV_WIDTH * YUV_HEIGHT / 4];yuv[2] = new unsigned char[YUV_WIDTH * YUV_HEIGHT  / 4];
//2,申请一个用于存放RGBA数据的数组 并设置好linesizeunsigned char* rgba = new unsigned char[RGB_WIDTH * RGB_HEIGHT *4];int rgba_linesize = RGB_WIDTH * 4;//3,打开YUV_FILE文件 和 RGBA_FILEifstream ifs;ifs.open(YUV_FILE, ios::binary);if(!ifs){cout << "open file failed" << endl;return -1;}ofstream ofs;ofs.open("yuv2rgb.rgb", ios::binary);if(!ofs){cout << "open file yuv2rgb.rgb file failed" << endl;return -2;}
//4, 循环转换至文件结束 转换要用到SwsContex对象SwsContext* yuv2rgb = nullptr; //yuv -> rgbafor(;;){//读取一帧的yuv数据ifs.read((char*)yuv[0], YUV_WIDTH * YUV_HEIGHT);ifs.read((char*)yuv[1], YUV_WIDTH * YUV_HEIGHT / 4);ifs.read((char*)yuv[2], YUV_WIDTH * YUV_HEIGHT / 4);//获取yuv转RGBA的上下文yuv2rgb = sws_getCachedContext(yuv2rgb, //转换上下文, 如果是nullptr新建, 不是nullptr判断是否与现有参数一致, 一致直接返回, 不一致先清理原数据, 再新建YUV_WIDTH, YUV_HEIGHT, //输入数据的宽高AV_PIX_FMT_YUV420P,  //输入的像素格式RGB_WIDTH, RGB_HEIGHT, //输出数据的宽高AV_PIX_FMT_RGBA,       //输出的像素格式SWS_BILINEAR,          //选择变换算法, 双线性插值算法0,0,0                  //过滤器参数);if(!yuv2rgb){cout << "sws_getCacheContext failed" << endl;return -4;}//通过格式转换上下文yuv2rgb开始转换int ret = sws_scale(yuv2rgb,yuv,     //输入数据yuv_linesize, //输入数据行字节数0,            //图像层次YUV_HEIGHT, //输入高度&rgba,      //输出的数据&rgba_linesize //输出的行大小);cout << ret << " " << flush;//写入文件ofs.write((char*)rgba, RGB_WIDTH  * RGB_HEIGHT  * 4);if(ifs.eof()) break;}ifs.close();ofs.close();//rgb转yuvifs.open(RGBA_FILE, ios::binary);if(!ifs){cout << "open file failed" << endl;return -5;}ofs.open("rgb2yuv.yuv", ios::binary);if(!ifs){cout << "open rgb2yuv.yuv failed" << endl;return -6;}SwsContext* rgb2yuv = nullptr; //rgba -> yuvfor(;;){ifs.read((char*)rgba, RGB_WIDTH * RGB_HEIGHT * 4);rgb2yuv = sws_getCachedContext(rgb2yuv, //转换上下文, NULL新创建, 非NULL判断与现有参数是否一致, 一致直接返回, 不一致先清理原数据,然后再创建RGB_WIDTH, RGB_HEIGHT,  // 输入宽高AV_PIX_FMT_RGBA,     //输入像素格式YUV_WIDTH, YUV_HEIGHT,  //输出宽高AV_PIX_FMT_YUV420P,       //输出像素格式SWS_BILINEAR,           //选择变换算法, 双线性插值算法0, 0, 0                    //过滤器参数);if(!rgb2yuv){cout << "sws_getCachedContext failed" << endl;return -7;}int ret = sws_scale(rgb2yuv,&rgba,            //输入数据&rgba_linesize,   //输入数据行字节数0,                //图像层次RGB_HEIGHT,           //输入高度yuv,          //输出的数据yuv_linesize //输出的行大小);cout << ret << " " << flush;ofs.write((char *)yuv[0], YUV_WIDTH * YUV_HEIGHT);ofs.write((char*)yuv[1], YUV_WIDTH * YUV_HEIGHT /4);ofs.write((char*)yuv[2], YUV_WIDTH* YUV_HEIGHT / 4);if (ifs.eof()) break;}ifs.close();ofs.close();delete yuv[0]; //别忘了清理空间delete yuv[1]; //别忘了清理空间delete yuv[2]; //别忘了清理空间delete rgba;//别忘了清理空间}

sws_scale函数像素数据格式的转换yuv转rgba相关推荐

  1. ffmpeg 视频像素尺寸转换SwsContext、sws_scale 函数解释

    函数介绍 SwsContext 格式转换的上下文,下面是 初始化函数 struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixe ...

  2. 【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV - RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )

    文章目录 I . FFMPEG AVFrame 图像数据帧处理 前置操作 II . FFMPEG 解码 AVPacket 数据到 AVFrame 流程 III. FFMPEG 解码前后的图像格式 IV ...

  3. ffmpeg学习十三:图像数据格式的转换与图像的缩放

    一.实现图像数据格式转换与图像缩放的三个重要函数 ffmpeg实现图像数据格式的转换以及图片的缩放的功能,主要使用swscale.h中的三个函数: sws_getContext() sws_scale ...

  4. FFmpeg源码分析:sws_scale图像缩放与图像转换

    FFmpeg在libswscale模块提供图像缩放与图像转换功能,比如1080P图像缩放为720P,或者YUV422P转换为YUV420P.图像缩放函数有个SwsContext结构体作为上下文,上一篇 ...

  5. 【nv12 格式转换】不同图像数据格式之间转换代码实操

    文章目录 1 问题先行 2 nv12介绍 2.1 YUV格式 2.2 NV12排布 3 不同数据格式之间转换实操 4 参考链接 1 问题先行 nv12是什么格式?和常见的rgb/bgr有什么关系吗?他 ...

  6. ffmpeg sws_scale函数详解

    1. 介绍 如果想在两个AVPixelFormat之间转换,例如将YUV420P 转换到YUV422,亦或者是要改变其大小,放大缩小什么的,就要用到ffmpeg中的swscale函数了,此版本基于ff ...

  7. FFmpeg学习之视频像素和尺寸转换

    1. 获取像素格式转换的上下文 sws_getCachedContext 2. 像素转换 sws_scale #include <iostream> #include <thread ...

  8. 【专题3:电子工程师 之 上位机】 之 【44.使用ffmpeg对视频解码、视频像素和尺寸转换、重采样】

    嵌入式工程师成长之路 系列文章 总目录 希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所 ...

  9. sws_scale函数

    FFmpeg中的 sws_scale() 函数主要是用来做视频像素格式和分辨率的转换,其优势在于:可以在同一个函数里实现:1.图像色彩空间转换, 2:分辨率缩放,3:前后图像滤波处理.不足之处在于:效 ...

最新文章

  1. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
  2. 洛谷P3884 二叉树问题
  3. java arraylist的问题
  4. APP性能之终端兼容
  5. MariaDB 数据库索引详解(9)
  6. 前端学习(2580):提升开发效率的工具
  7. 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
  8. POJ 1088-滑雪
  9. LInux之gz文件压缩/解压缩
  10. java 构造函数 单例_Java中的私有构造函数和单例类 - Break易站
  11. 《机器人编程实战》一一1.2 给机器人指令
  12. 取得人生成功的40条定律
  13. 二维数组求最小值_求一列中满足条件的最大最小值
  14. jquery学习之$(document).ready()
  15. 锐捷长ping_【路由】交换卡下的客户端无法ping通网关
  16. 产品生命周期管理(PLM)
  17. Java 程序员常用资源网站集合
  18. vue针对ele的form组件校验
  19. 屌炸天,像写代码一样写PPT,reveal-md 详解
  20. 学了C语言想装x能干点啥?手把手教你写个聊天软件来玩玩

热门文章

  1. Python爬虫——Cookie模拟登录
  2. 我自己注册的账号,凭什么不让我注销?谁动了我们的“注销权”...
  3. react前端显示图片_在react中怎么动态渲染图片?
  4. java 与或非_JAVA 或与非运算符 与()、或(|)、异或(^)
  5. 929. 独特的电子邮件地址
  6. 数据库基本概念amp;SQL简介
  7. 《江山美人》得意三八档 上映三天获票房冠军
  8. JavaEE(SSM框架,黑马程序员) P163~P178
  9. HTML中placeholder用法
  10. 本科科研经历(技术干货篇-论文发表流程)