ffmpeg使用png编码器把rgb24编码为png图像

version

#define LIBAVCODEC_VERSION_MAJOR  60

#define LIBAVCODEC_VERSION_MINOR  15

#define LIBAVCODEC_VERSION_MICRO 100

note

不使用AVOutputFormat

code

void CFfmpegOps::EncodeRGB24ToPNG(const char *infile, const char *width_str, const char *height_str, const char *outfile)
{if ((!infile) || (!width_str) || (!height_str) || (!outfile)){return;}int width = 0;int height = 0;AVFrame *rgb24frame = nullptr;int rgb24frame_bytes = 0;AVPixelFormat rgb24_fmt = AV_PIX_FMT_RGB24;int ret = -1;FILE *in_fp = nullptr;size_t n = 0;AVPacket *pkt = nullptr;const AVCodec *png_encoder = nullptr;AVCodecContext *png_encoder_ctx = nullptr;FILE *out_fp = nullptr;try{width = std::stoi(width_str);height = std::stoi(height_str);}catch (const std::exception &e){return;}rgb24frame = av_frame_alloc();if (!rgb24frame){printf("av_frame_alloc error\n");goto end;}rgb24frame->format = rgb24_fmt;rgb24frame->width = width;rgb24frame->height = height;rgb24frame_bytes = av_image_get_buffer_size(rgb24_fmt, width, height, 1);ret = av_frame_get_buffer(rgb24frame, 0);if (ret < 0){printf("av_frame_get_buffer error(%s)\n", GetFfmpegERR(ret));goto end;}in_fp = fopen(infile, "rb");if (!in_fp){printf("fopen error\n");goto end;}n = fread(rgb24frame->data[0], sizeof(uint8_t), width * height * 3, in_fp);if ((int)n != (width * height * 3)){printf("n != (width * height * 3)\n");goto end;}pkt = av_packet_alloc();if (!pkt){printf("av_packet_alloc error\n");goto end;}png_encoder = avcodec_find_encoder(AV_CODEC_ID_PNG);if (!png_encoder){printf("avcodec_find_encoder error\n");goto end;}png_encoder_ctx = avcodec_alloc_context3(png_encoder);if (!png_encoder_ctx){printf("avcodec_alloc_context3 error\n");goto end;}png_encoder_ctx->pix_fmt = rgb24_fmt;png_encoder_ctx->width = width;png_encoder_ctx->height = height;png_encoder_ctx->time_base.num = 1;png_encoder_ctx->time_base.den = 25;png_encoder_ctx->framerate.num = 25;png_encoder_ctx->framerate.den = 1;png_encoder_ctx->bit_rate = rgb24frame_bytes * png_encoder_ctx->framerate.num * 8;ret = avcodec_open2(png_encoder_ctx, png_encoder, nullptr);if (ret < 0){printf("avcodec_open2 error(%s)\n", GetFfmpegERR(ret));goto end;}out_fp = fopen(outfile, "wb");if (!out_fp){printf("fopen error\n");goto end;}ret = avcodec_send_frame(png_encoder_ctx, rgb24frame);if (ret != 0){printf("avcodec_send_frame error(%s)\n", GetFfmpegERR(ret));goto end;}while (1){ret = avcodec_receive_packet(png_encoder_ctx, pkt);if (ret != 0){if (ret == AVERROR(EAGAIN)){continue;}printf("avcodec_receive_packet error(%s)\n", GetFfmpegERR(ret));break;}n = fwrite(pkt->data, pkt->size, sizeof(uint8_t), out_fp);av_packet_unref(pkt);break;}end:if (out_fp){fclose(out_fp);out_fp = nullptr;}if (png_encoder_ctx){avcodec_free_context(&png_encoder_ctx);png_encoder_ctx = nullptr;}if (pkt){av_packet_free(&pkt);pkt = nullptr;}if (in_fp){fclose(in_fp);in_fp = nullptr;}if (rgb24frame){av_frame_free(&rgb24frame);rgb24frame = nullptr;}
}

performance

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/368515.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海外短剧CPS推广分佣系统平台讲解,他和短剧播放平台有啥区别?

首先来讲讲什么是海外短剧系统&#xff1f;什么是海外短剧cps系统&#xff1f;这俩有何区别&#xff1f; 海外短剧系统 顾名思义&#xff1a;就是做一套海外短剧系统&#xff0c;把剧放在自己的系统内&#xff0c;让用户来充值&#xff0c;充值的钱全部都是我自己的&#xff…

【区块链+基础设施】蜀信链 | FISCO BCOS应用案例

蜀信链是在四川省经济和信息化厅指导下&#xff0c;在四川省区块链行业协会组织下&#xff0c;由全省区块链相关从业与应用机构 共同参与建设和运营的区域性区块链基础设施&#xff0c;通过多方协同&#xff0c;共同打造合作共赢的区块链产业生态。 蜀信链区块链服务生态秉承“…

ubuntu24.04LTS防火墙设置

Ubuntu24.04LTS开箱自带ufw&#xff0c;一定程度避免了开机下载ufw被攻击&#xff0c;excellent 转载aliyun教程 sudo ufw enbale可以启用并且开机自启(显示有效&#xff0c;未nmap实测) 教程3 转载自CSDN 完整格式如下&#xff1a; # 禁止IP连接端口 sudo ufw deny proto tc…

CSS filter(滤镜)属性,并实现页面置灰效果

目录 一、filter&#xff08;滤镜&#xff09;属性 二、准备工作 三、常用的filter属性值 1、blur(px) 2、brightness(%) 3、contrast(%) 4、grayscale(%) 5、opacity(%) 6、saturate(%) 7、sepia(%) 8、invert(%) 9、hue-rotate(deg) 10、drop-shadow(h-shadow v…

java生成excel,uniapp微信小程序接收excel并打开

java引包&#xff0c;引的是apache.poi <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency> 写一个测试类&#xff0c;把excel输出到指定路径 public s…

汽车电子工程师入门系列——AUTOSAR通信服务框架(下)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

关于 lvds 屏幕的一些知识

网上的截图&#xff1a; lvds的 通道。 lvds 的协议 关于 sync 模式与 de 模式&#xff1a; ------------------------------------------------------------------------------------------------------------------ 芯片的数据手册的看法。 这个手册 &#xff0c;就指明了…

代码托管服务:GitHub、GitLab、Gitee

目录 引言GitHub&#xff1a;全球最大的代码托管平台概述功能特点适用场景 GitLab&#xff1a;一体化的开发平台概述功能特点适用场景 Gitee&#xff08;码云&#xff09;&#xff1a;中国本土化的代码托管服务概述功能特点适用场景 功能对比结论 引言 在现代软件开发中&#…

【路由交换技术】Cisco Packet Tracer基础入门教程(五)

这一期我们来学习端口聚合&#xff0c;这是针对交换机的技术 前言 不知道大家有没有注意到&#xff0c;我们之前的实验在交换机与交换机之间只用一条线连接&#xff0c;像这样 通过今天的学习&#xff0c;我们要用两条线来连接交换机&#xff0c;就像这样&#xff08;为了能…

Postman接口测试工具详解【保姆级教程】

大家好,我是CodeQi! 在我们日常的开发工作中,无论是前端还是后端,API 接口的测试都是必不可少的一环。 你有没有遇到过这样的情况:接口测试工具复杂难用,使用起来让人抓狂;或者手动构造请求效率低下,容易出错? 别担心,我今天要介绍的 Postman 工具,将会彻底改变你…

List接口, ArrayList Vector LinkedList

Collection接口的子接口 子类Vector&#xff0c;ArrayList&#xff0c;LinkedList 1.元素的添加顺序和取出顺序一致&#xff0c;且可重复 2.每个元素都有其对应的顺序索引 方法 在index 1 的位置插入一个对象&#xff0c;list.add(1,list2)获取指定index位置的元素&#…

概率论与数理统计_下_科学出版社

contents 前言第5章 大数定律与中心极限定理独立同分布中心极限定理 第6章 数理统计的基本概念6.1 总体与样本6.2 经验分布与频率直方图6.3 统计量6.4 正态总体抽样分布定理6.4.1 卡方分布、t 分布、F 分布6.4.2 正态总体抽样分布基本定理 第7章 参数估计7.1 点估计7.1.1 矩估计…

C++中的类型转换操作符:static_cast reinterpret_cast const_cast dynamic_cast

目录​​​​​​​ C语言中的类型转换 C中的类型转换 C中的类型转换操作符 static_cast reinterpret_cast const_cast volatile关键字 赋值兼容 dynamic_cast C语言中的类型转换 基本概念&#xff1a;赋值运算符左右两侧类型不同&#xff0c;或形参与实参类型不匹配…

抖音微短剧小程序源码搭建:实现巨量广告数据高效回传

在数字化营销日益盛行的今天&#xff0c;抖音微短剧小程序已成为品牌与观众互动的新渠道。这些短小精悍的剧目不仅能迅速抓住用户的注意力&#xff0c;还能有效提升品牌的知名度和用户黏性。然而&#xff0c;想要充分利用这一营销工具&#xff0c;关键在于如何高效地追踪广告数…

【PyQt】20-QTimer(动态显示时间、定时关闭)

QTimer 前言一、QTimer介绍二、动态时间展示2.1 代码2.2 运行结果 三、定时关闭3.1 介绍他的两种用法1、使用函数或Lambda表达式2、带有定时器类型&#xff08;高级&#xff09; 3.2 代码3.3 运行结果 总结 前言 好久没学习了。 一、QTimer介绍 pyqt里面的多线程可以有两种实…

【python数据处理】— “2020-01-01 05:20:15“日期格式数据

文章目录 一、数据说明及目标二、实现方式1.提取date2.提取hour3.提取weekday4.提取month 一、数据说明及目标 数据说明 数据表有一列名为"datetime"表示时间数据&#xff0c;该列的数据格式是"2020-01-01 05:20:15"。 import pandas as pd datapd.read_e…

基于SpringBoot的超市进销存系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;MyEclipse、Tomcat 系统展示 首页 首页界面图 个人中心 个人中心…

地理信息科学:生态保护的智慧经纬

在地球这颗蓝色星球上&#xff0c;每一片森林的呼吸、每一条河流的流淌&#xff0c;都是生命交响曲中不可或缺的音符。而地理信息科学&#xff08;GIS&#xff09;&#xff0c;正是我们手中解读自然密码、护航生态平衡的精密仪器。今天&#xff0c;让我们深入探讨GIS如何在生物…

万界星空科技QMS系统:重塑质量管理新纪元

万界星空科技QMS&#xff08;Quality Management System&#xff09;质量管理系统是一套全面、高效的质量管理工具&#xff0c;旨在帮助企业提升产品质量、优化生产流程、降低质量成本。该系统具备多个具体功能模块&#xff0c;以下是对其主要功能模块的详细介绍&#xff1a; 一…

通过easyexcel导入数据,添加表格参数的校验,同表格内校验以及和已有数据的校验

引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.11</version><scope>compile</scope></dependency> 需要导入到某个目录下 如果产品名称相同&#xff0c…