sws_scale像素格式转换RGBA转YUV420P,并存入文件

2024-05-31 19:52

本文主要是介绍sws_scale像素格式转换RGBA转YUV420P,并存入文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


#include <iostream>
#include <fstream>
using namespace std;
extern "C" { //指定函数是c语言函数,函数名不包含重载标注
//引用ffmpeg头文件
#include <libswscale/swscale.h>
}
//预处理指令导入库
#pragma comment(lib,"swscale.lib")
#define YUV_FILE "400_300_25.yuv"
#define RGBA_FILE "800_600_25.rgba"
int main(int argc, char* argv[])
{cout << "111_test_sws_scale" << endl;// ffmpeg -i test.mp4 -s 400x300 400_300_25.yuv// 400x300 YUV 转 RGBA 800x600 并存到文件int width = 400;//yuv 宽度int height = 300;//yuv高度int rgb_width = 800;int rgb_height = 600;// YUV420P 平面存储 yyyy uu vvunsigned char* yuv[3] = { 0 };int yuv_linesize[3] = { width,width / 2,width / 2 };yuv[0] = new unsigned char[width * height]; //Yyuv[1] = new unsigned char[width * height / 4]; //Uyuv[2] = new unsigned char[width * height / 4]; //V//RGBA交叉存储 rgba rgbaunsigned char* rgba = new unsigned char[rgb_width * rgb_height * 4];//rgba为存储rgba数据的数组int rgba_linesize = rgb_width * 4;// rgba数据的行大小ifstream ifs;// input file stream ,用于从文件读取数据ifs.open(YUV_FILE, ios::binary);//ifs对象关联yuv数据文件ofstream ofs;//output file stream,用于将数据写入文件ofs.open(RGBA_FILE, ios::binary);YUV420转RGBASwsContext* yuv2rgb = nullptr;for (int i = 0; i < 10; i++){//读取YUV帧ifs.read((char*)yuv[0], width * height);ifs.read((char*)yuv[1], width * height / 4);ifs.read((char*)yuv[2], width * height / 4);if (ifs.gcount() == 0)break;//YUV转RGBA //上下文件创建和获取yuv2rgb = sws_getCachedContext(yuv2rgb,                 //转换上下文,NULL新创建,非NULL判断与现有参数是否一致,//一致直接返回,不一致先清理当前然后再创建width, height,           //输入宽高AV_PIX_FMT_YUV420P,     //输入像素格式rgb_width, rgb_height,   //输出的宽高AV_PIX_FMT_RGBA,        //输出的像素格式SWS_BILINEAR,           //选择支持变化的算法,双线性插值0, 0, 0                 //过滤器参数);unsigned char* data[1];//创建一个指针数组data,里面只有一个元素data[0] = rgba;//用rgba数组的数组名(表示这个数组的起始地址)赋值给data[0],表示data也指向rgba数组的首地址,即指向rgba的数据int lines[1] = { rgba_linesize };//lines[1]存储rgba数据的行大小int re = sws_scale(yuv2rgb,//int re:用于存储 sws_scale 的返回值,通常表示处理的行数。yuv,                //输入数据yuv_linesize,       //输入数据行字节数0,height,             //输入高度data,               //指向目标图像每个平面的数据指针数组。即rgba数据的指针lines);//将yuv数据转换成rgba数据,并用data数组存储rgba数据,对data的处理等同于对rgba指针的处理,因为他们指向同一片数据cout << re << " " << flush;ofs.write((char*)rgba, rgb_width * rgb_height * 4);}ofs.close();ifs.close();//RGBA转YUV720PSwsContext* rgb2yuv = nullptr;//一定要以二进制打开ifs.open(RGBA_FILE, ios::binary);for (;;){//读取YUV帧ifs.read((char*)rgba, rgb_width * rgb_height * 4);if (ifs.gcount() == 0)break;//YUV转RGBA //上下文件创建和获取yuv2rgb = sws_getCachedContext(rgb2yuv,                 //转换上下文,NULL新创建,非NULL判断与现有参数是否一致,//一致直接返回,不一致先清理当前然后再创建rgb_width, rgb_height,           //输入宽高AV_PIX_FMT_RGBA,     //输入像素格式width, height,   //输出的宽高AV_PIX_FMT_YUV420P,        //输出的像素格式SWS_BILINEAR,           //选择支持变化的算法,双线性插值0, 0, 0                 //过滤器参数);unsigned char* data[1];data[0] = rgba;int lines[1] = { rgba_linesize };int re = sws_scale(yuv2rgb,data,                //输入数据lines,       //输入数据行字节数0,rgb_height,             //输入高度yuv,               //输出数据yuv_linesize);cout << "(" << re << ") " << flush;}delete yuv[0];delete yuv[1];delete yuv[2];delete rgba;return 0;
}

自己看文件注释吧,就这一个main函数。

这篇关于sws_scale像素格式转换RGBA转YUV420P,并存入文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1018893

相关文章

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr