FFmpeg 像素格式和尺寸转换函数

双线性过滤(Bilinear_filtering)

代码

test_sws_scale.cpp

#include <iostream>
#include <fstream>extern "C"
{
#include "libswscale/swscale.h"
}#pragma comment(lib, "swscale.lib")#define YUVFILE   "400_300_25.yuv"
#define RGBAFILE  "800_600_25.rgba"using namespace std;int main()
{ifstream ifs;ofstream ofs;const int yuv_width = 400;const int yuv_height = 300;const int rgba_width = 800;const int rgba_height = 600;unsigned char* yuv[3] = { 0 };SwsContext* yuv2rgba = nullptr;SwsContext* rgba2yuv = nullptr;int yuv_linesize[3] = { yuv_width , yuv_width / 2, yuv_width / 2 };unsigned char* rgba = nullptr;int rgba_linesize = rgba_width * 4;int slice_height = 0;yuv[0] = new unsigned char[yuv_width * yuv_height];      // Yyuv[1] = new unsigned char[yuv_width * yuv_height / 4];  // Uyuv[2] = new unsigned char[yuv_width * yuv_height / 4];  // Vrgba = new unsigned char[rgba_width * rgba_height * 4];ifs.open(YUVFILE, ios::in | ios::binary);if (!ifs){cerr << "open " << YUVFILE << " failed" << endl;return -1;}ofs.open(RGBAFILE, ios::out | ios::binary);if (!ofs){cerr << "open " << RGBAFILE << " failed" << endl;return -1;}/* YUV420P 转 RGBA */for (int i = 0; i < 10; i++)  // 读取10帧数据{/* 读取一帧的 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);/* 文件已经读完 */if (ifs.gcount() == 0){break;}/* YUV转RGBA  上下文件创建和获取 */yuv2rgba = sws_getCachedContext(yuv2rgba,                    // 转换上下文,NULL新创建,非NULL判断与现有参数是否一致,// 一致直接返回,不一致先清理当前然后再创建yuv_width, yuv_height,     // 输入宽高AV_PIX_FMT_YUV420P,          // 输入像素格式rgba_width, rgba_height,   // 输出的宽高AV_PIX_FMT_RGBA,            // 输出的像素格式SWS_BILINEAR,             // 选择支持变化的算法,双线性插值nullptr, nullptr, nullptr  // 过滤器参数);if (!yuv2rgba){cerr << "sws_getCachedContext failed!" << endl;return -1;}slice_height = sws_scale(yuv2rgba,yuv,            // 输入数据yuv_linesize,    // 输入数据行字节数0, yuv_height,       // 输入高度&rgba,           // 输出数据&rgba_linesize);ofs.write((char*)rgba, rgba_width * rgba_height * 4);  // 将转换后的 RGBA 数据写入到 rgba 文件中cout << slice_height << " " << flush;}ifs.close();ofs.close();ifs.open(RGBAFILE, ios::in | ios::binary);if (!ifs){cerr << "open " << YUVFILE << " failed" << endl;return -1;}/* 将 RGBA 转成 YUV420P */for (;;){/* 读取一帧的 RGBA 数据 */ifs.read((char*)rgba, rgba_width * rgba_height * 4);/* 文件已经读完 */if (ifs.gcount() == 0){break;}/* RGBA 转 YUV 上下文件创建和获取 */rgba2yuv = sws_getCachedContext(rgba2yuv,                  // 转换上下文,NULL新创建,非NULL判断与现有参数是否一致,// 一致直接返回,不一致先清理当前然后再创建rgba_width, rgba_height,   // 输入宽高AV_PIX_FMT_RGBA,         // 输入像素格式yuv_width, yuv_height,         // 输出的宽高AV_PIX_FMT_YUV420P,         // 输出的像素格式SWS_BILINEAR,             // 选择支持变化的算法,双线性插值nullptr, nullptr, nullptr  // 过滤器参数);if (!rgba2yuv){cerr << "sws_getCachedContext failed!" << endl;return -1;}slice_height = sws_scale(rgba2yuv,&rgba,          // 输入数据&rgba_linesize,  // 输入数据行字节数0,rgba_height,   // 输入高度yuv,         // 输出数据yuv_linesize);cout << "(" << slice_height << ")"  << " " << flush;}ifs.close();delete[] yuv[0];delete[] yuv[1];delete[] yuv[2];delete[] rgba;return 0;
}

实现了 YUV420P 和 RGBA 图像不同尺寸不同像素格式之间的转换。

测试结果

sws_scale像素格式转换RGBA转YUV420P相关推荐

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

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

  2. 解码(五):sws_getContext和sws_scale像素格式和尺寸转换函数详解

    视频像素格式和尺寸转换 sws_getContext(像素格式转换上下文),提供了两个函数 sws_getContext像素格式上下文初始化代码演示 如下代码: //表示是视频if (cc == vc ...

  3. 编解码(1)之基本像素格式转换

    编解码(1)之基本像素格式转换 后面会适当更新记录 今天项目中发现以前移过来的代码 有转BGR24到NV12的代码 一堆for 还用了opencv  的cvtColor最后还是图像绘框还有问题 琢磨不 ...

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

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

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

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

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

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

  7. qsv的像素格式转换

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

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

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

  9. DX 纹理像素格式转换算法 R10G10B10A2 转 R8G8B8A8

    DXGI_FORMAT_R10G10B10A2_UNORM 和 DXGI_FORMAT_R8G8B8A8_UNORM 1个像素都是32位整数表示,只是位数不一样 DXGI_FORMAT_R10G10B ...

最新文章

  1. python工具是什么-python有什么好用的持续集成工具么?
  2. Nginx 和 PHP的安装配置
  3. Linux云服务ModuleNotFoundError: No module named 'MySQLdb'
  4. visual studio 设计器不显示_面向国际市场的装置开发运维软件设计与实现
  5. Spring框架之权限管理
  6. 计算一个人出生了多少天(炸窝)
  7. 事务(注解声明式事务管理)
  8. 揭秘黑石、橡树等巨头的不良资产赚钱术
  9. 计算机多媒体最新参考文献,计算机多媒体论文
  10. itools苹果录屏大师_如何录制ZOOM视频会议?实用的录屏软件
  11. 2022年低压电工考试题库及模拟考试
  12. nx显示服务器错误,ug6.0软件打开出现nx许可证错误的解决办法
  13. 【word毕业论文排版(1)】尾注的删除
  14. ant design vue金额校验
  15. 计算机英语作文50词左右带翻译,找十篇英语作文,带翻译,50个词
  16. Python基础复习09_面向对象特性
  17. linux的cut命令详解
  18. php判断是不是顺子,php 怎么判断为顺子,三个相邻的数字
  19. php英语单词出现了几次,PHP如何实现英语单词 单复数 转换?
  20. 独角兽项目 6 - 合并冲突

热门文章

  1. 常用git指令(以及绑定远程仓库)
  2. element ui表格勾选后勾选框置灰,不可再勾选
  3. Java并发基础,不怕你看不懂
  4. C语言实现将字符串转换为数字的方法
  5. November 2006
  6. 【操作系统】实现生产者消费者模型
  7. 烟台:百亿新能源整车项目落户 打造新能源汽车全产业链
  8. python线性回归预测pm2.5_李洪义——机器学习作业——1-线性回归:预测PM2.5,李宏毅,1LinearRegression,PM25...
  9. PaaS概念遍地开花,Gartner教你分辨“泡沫”和“爆点”
  10. 树莓派FreePBX设置电话系统