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

news2024/11/24 3:23:08

version

#define LIBAVUTIL_VERSION_MAJOR  58

#define LIBAVUTIL_VERSION_MINOR  12

#define LIBAVUTIL_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.coloradmin.cn/o/1874096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是ArchiMate?有优缺点和运用场景?

一、什么是ArchiMate? ArchiMate是一种由The Open Group发布的企业级标准&#xff0c;它是一种整合多种架构的可视化业务分析模型语言&#xff0c;也属于架构描述语言&#xff08;ADL&#xff09;。ArchiMate主要从业务、应用和技术三个层次&#xff08;Layer&#xff09;&…

基于MATLAB对线阵天线进行道尔夫—切比雪夫加权

相控阵天线——基于MATLAB对线阵进行道尔夫—切比雪夫加权 目录 前言 一、阵列天线的综合 二、道尔夫—切比雪夫综合 三、单元间距的改变对切比雪夫阵列方向图的影响 四、单元数的改变对切比雪夫阵列激励分布的影响 五、副瓣电平SLL对切比雪夫阵列激励幅度的影响 六、副…

双路视频同屏显示(拼接)-基于野火Zynq7020开发板

前情提要 米联客FDMA驱动OV5640摄像头—基于野火Zynq7020开发板 本文在此基础上&#xff0c;实现了双路视频拼接。将ov5640输出的1024600的图像数据缩放为512600&#xff0c;分两路写入ddr3&#xff0c;并且显示在1024*600的RGB屏幕中。 纯FPGA也可以按此方法实现。 总体BLOC…

MySQL高级-SQL优化-小结

文章目录 1、insert 优化2、主键优化3、order by 优化4、group by 优化5、limit 优化6、count 优化7、update 优化 1、insert 优化 insert&#xff1a;批量插入、手动控制事务、主键顺序插入 大批量插入&#xff1a;load data local infile 2、主键优化 主键长度尽量短、顺序插…

遥感数据并行运算(satellite remote sensing data parallell processing)

文章内容仅用于自己知识学习和分享&#xff0c;如有侵权&#xff0c;还请联系并删除 &#xff1a;&#xff09; 之前不太会用&#xff0c;单纯想记录一下&#xff0c;后面或许还会用到 1. 教程 [1] Pleasingly Parallel Programming: link 1.1 处理器&#xff0c;核和线程 …

基于多模态知识图谱的多模态推理-MR-MKG

MR-MKG论文中提出了一种新的多模态推理方法&#xff0c;即利用多模态知识图&#xff08;Multimodal Knowledge Graph, MMKG&#xff09;进行多模态推理的方法。这种方法旨在通过从MMKG中学习&#xff0c;扩展大型语言模型&#xff08;LLMs&#xff09;的多模态知识。 1 三个模…

【AUTOSAR 基础软件】DEM模块详解(诊断故障管理)

文章包含了AUTOSAR基础软件&#xff08;BSW&#xff09;中DEM模块相关的内容详解。本文从ISO标准&#xff0c;AUTOSAR规范解析&#xff0c;ISOLAR-AB配置以及模块相关代码分析四个维度来帮读者清晰的认识和了解DEM这一基础软件模块。文中涉及的ISOLAR-AB配置以及模块相关代码都…

深度相机识别物体——实现数据集准备与数据集分割

一、数据集准备——Labelimg进行标定 1.安装labelimg——pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple 2.建立相应的数据集存放文件夹 3.打开labelimg&#xff0c;直接在命令行输入labelimg即可&#xff0c;并初始化 4.开始标注&#xff0c;设置标注好…

[Cloud Networking] VLAN

1 为什么需要 VLAN(Virtual Local Area Network) VLAN是一个逻辑网络&#xff0c;VLAN将设备/用户进行逻辑分组&#xff0c;VLAN需要在Switch上创建。为什么需要这样呢&#xff1f;为何不能所有设备都在同一个网络&#xff1f; 如下网络&#xff0c;如果设备过多&#xff0c;…

五线谱与简谱有什么区别 五线谱简谱混排怎么打 吉他谱软件哪个好

五线谱与简谱作为音乐记谱领域的两大主流系统&#xff0c;各自承载着深厚的历史渊源与独特的表现力&#xff0c;并在全球范围内被不同程度地接受和应用。尽管两者都是为了记录音乐作品中的音高和节奏信息&#xff0c;但其内在机制、适用范围以及学习曲线存在显著差别。下面我们…

QT拖放事件之七:子类化QMimeData,实现对多个自定义类型进行数据

1、前提说明 /*自定义的MIME类型数据存储在QMimeData对象中, 存在两种方法:1. setData(...)可以把自定义类型的数据以QByteArray的形式直接存储在QMimeData中,但是使用此方法一次只能对一个MIME类型进行处理(可参考 QT拖放事件六:自定义MIME类型的存储及读取demo ) 一文。…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-44目标检测算法综述:R-CNN、SSD和YOLO

41~44目标检测算法综述&#xff1a;R-CNN、SSD和YOLO 1. 区域卷积神经网络 (R-CNN 系列) 1.1 R-CNN 使用启发式搜索算法来选择锚框。使用预训练模型对每个锚框提取特征&#xff08;每个锚框视为一张图片&#xff0c;使用 CNN 提取特征&#xff09;。训练 SVM 进行类别分类&a…

Halcon 文本文件操作,形态学

一文件的读写 *******************************************************向文本文件写入字符串内容*************************************************************read_image (Image, fabrik)threshold (Image, Region, 0, 120)area_center (Region, Area, Row, Column)open_…

Linux启动elasticsearch,提示权限不够

Linux启动elasticsearch&#xff0c;提示权限不够&#xff0c;如下图所示&#xff1a; 解决办法&#xff1a; 设置文件所有者&#xff0c;即使用户由权限访问文件 sudo chown -R 用户名[:新组] ./elasticsearch-8.10.4 //切换到elasticsearch-8.10.4目录同级 chown详细格式…

面对.rmallox勒索病毒:如何有效防范及应对

引言&#xff1a; 在当今数字化社会&#xff0c;网络安全问题日益严重&#xff0c;勒索病毒成为企业和个人不可忽视的威胁之一。最近出现的.rmallox勒索病毒更是给全球各地的用户带来了严重的数据安全问题。本文将探讨.rmallox勒索病毒的特点、感染方式及应对策略&#xff0c;…

format()方法——格式化字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法介绍 format()可以对数据进行格式化处理操作&#xff0c;语法如下&#xff1a; format(value, format_spec) format_spec为格式化解释。当参数…

【代码工厂】简单地图生成

要求 &#xff08;图片来自codingame&#xff09; 代码 # 定义一个函数&#xff0c;用于生成模式 def generate_pattern(n, a, border_char): # 初始化一个空列表&#xff0c;用于存储生成地图pattern []# 最上面那一行的处理line n * border_charpattern.append(line)# 遍…

Zabbix如何帮助企业将监控数据转化为竞争优势

By Fernanda Moraes 在我们生活的高度互联世界中&#xff0c;变化以越来越快和激烈的速度发生。这影响了消费者的认知与行为&#xff0c;迫使零售商寻找更有效的方式来吸引客户。Linx 是 StoneCo 集团旗下的一家公司&#xff0c;也是零售技术专家&#xff0c;Linx了解这一点&am…

两张图片怎样拼在一起?将两张图片拼在一起的几种方法介绍

两张图片怎样拼在一起&#xff1f;拼接两张图片是一种常见的编辑技巧&#xff0c;能够将不同的视觉元素融合成一个整体&#xff0c;从而创造出更加生动和丰富的图像效果。无论是为了设计创意作品、制作社交媒体内容&#xff0c;还是简单地为个人相册增添趣味&#xff0c;掌握如…

一个人 三个月 干了二十万

相信很多人是被这个标题吸引进来的&#xff0c;但我并不是标题党&#xff0c;我也很讨厌标题党&#xff0c;这篇文章也不在乎流量&#xff0c;更多的是想记录下。 出来创业三个多月了&#xff0c;给大家汇报一下这段时间的业绩吧。一个人&#xff0c;三个多月&#xff0c;干了…