sws_scale函数像素数据格式的转换yuv转rgba
本文介绍如何使用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相关推荐
- ffmpeg 视频像素尺寸转换SwsContext、sws_scale 函数解释
函数介绍 SwsContext 格式转换的上下文,下面是 初始化函数 struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixe ...
- 【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV - RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )
文章目录 I . FFMPEG AVFrame 图像数据帧处理 前置操作 II . FFMPEG 解码 AVPacket 数据到 AVFrame 流程 III. FFMPEG 解码前后的图像格式 IV ...
- ffmpeg学习十三:图像数据格式的转换与图像的缩放
一.实现图像数据格式转换与图像缩放的三个重要函数 ffmpeg实现图像数据格式的转换以及图片的缩放的功能,主要使用swscale.h中的三个函数: sws_getContext() sws_scale ...
- FFmpeg源码分析:sws_scale图像缩放与图像转换
FFmpeg在libswscale模块提供图像缩放与图像转换功能,比如1080P图像缩放为720P,或者YUV422P转换为YUV420P.图像缩放函数有个SwsContext结构体作为上下文,上一篇 ...
- 【nv12 格式转换】不同图像数据格式之间转换代码实操
文章目录 1 问题先行 2 nv12介绍 2.1 YUV格式 2.2 NV12排布 3 不同数据格式之间转换实操 4 参考链接 1 问题先行 nv12是什么格式?和常见的rgb/bgr有什么关系吗?他 ...
- ffmpeg sws_scale函数详解
1. 介绍 如果想在两个AVPixelFormat之间转换,例如将YUV420P 转换到YUV422,亦或者是要改变其大小,放大缩小什么的,就要用到ffmpeg中的swscale函数了,此版本基于ff ...
- FFmpeg学习之视频像素和尺寸转换
1. 获取像素格式转换的上下文 sws_getCachedContext 2. 像素转换 sws_scale #include <iostream> #include <thread ...
- 【专题3:电子工程师 之 上位机】 之 【44.使用ffmpeg对视频解码、视频像素和尺寸转换、重采样】
嵌入式工程师成长之路 系列文章 总目录 希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所 ...
- sws_scale函数
FFmpeg中的 sws_scale() 函数主要是用来做视频像素格式和分辨率的转换,其优势在于:可以在同一个函数里实现:1.图像色彩空间转换, 2:分辨率缩放,3:前后图像滤波处理.不足之处在于:效 ...
最新文章
- 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
- 洛谷P3884 二叉树问题
- java arraylist的问题
- APP性能之终端兼容
- MariaDB 数据库索引详解(9)
- 前端学习(2580):提升开发效率的工具
- 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
- POJ 1088-滑雪
- LInux之gz文件压缩/解压缩
- java 构造函数 单例_Java中的私有构造函数和单例类 - Break易站
- 《机器人编程实战》一一1.2 给机器人指令
- 取得人生成功的40条定律
- 二维数组求最小值_求一列中满足条件的最大最小值
- jquery学习之$(document).ready()
- 锐捷长ping_【路由】交换卡下的客户端无法ping通网关
- 产品生命周期管理(PLM)
- Java 程序员常用资源网站集合
- vue针对ele的form组件校验
- 屌炸天,像写代码一样写PPT,reveal-md 详解
- 学了C语言想装x能干点啥?手把手教你写个聊天软件来玩玩
热门文章
- Python爬虫——Cookie模拟登录
- 我自己注册的账号,凭什么不让我注销?谁动了我们的“注销权”...
- react前端显示图片_在react中怎么动态渲染图片?
- java 与或非_JAVA 或与非运算符 与()、或(|)、异或(^)
- 929. 独特的电子邮件地址
- 数据库基本概念amp;SQL简介
- 《江山美人》得意三八档 上映三天获票房冠军
- JavaEE(SSM框架,黑马程序员) P163~P178
- HTML中placeholder用法
- 本科科研经历(技术干货篇-论文发表流程)