ffmpeg使用mjpeg把yuvj420p编码为jpg图像
version
#define LIBAVUTIL_VERSION_MAJOR 58
#define LIBAVUTIL_VERSION_MINOR 12
#define LIBAVUTIL_VERSION_MICRO 100
node
不使用AVOutputFormat
code
void CFfmpegOps::EncodeYUVJ420pToMJPEG(const char* infile, const char* width_str, const char* height_str, const char* outfile)
{if ((!infile) || (!outfile)){return;}int32_t width = 0;int32_t height = 0;FILE *in_fp = nullptr;size_t n = 0;AVCodecContext *encoder_ctx = nullptr;const AVCodec *encoder = nullptr;FILE* out_fp = nullptr;int ret = -1;AVFrame *avframe = nullptr;AVPacket *avpacket = nullptr;int frame_bytes = 0;try{width = std::stoi(width_str);height = std::stoi(height_str);}catch (std::exception &e){return;}in_fp = fopen(infile, "rb");if (!in_fp){printf("fopen error\n");goto end;}avframe = av_frame_alloc();if (!avframe){printf("av_frame_alloc error\n");goto end;}avframe->width = width;avframe->height = height;avframe->format = AV_PIX_FMT_YUVJ420P;avframe->pts = 0;// 获取单帧yuvj420p的字节数frame_bytes = av_image_get_buffer_size((AVPixelFormat)(avframe->format), avframe->width, avframe->height, 1);ret = av_frame_get_buffer(avframe, 0);if (ret < 0){printf("av_frame_get_buffer error:%s\n", GetFfmpegERR(ret));goto end;}// 读取y分量n = fread(avframe->data[0], sizeof(uint8_t), avframe->width * avframe->height, in_fp);if ((int)n != (avframe->width * avframe->height)){printf("n != (avframe->width * avframe->height)\n");goto end;}// 读取u分量n = fread(avframe->data[1], sizeof(uint8_t), avframe->width * avframe->height / 4, in_fp);if ((int)n != (avframe->width * avframe->height / 4)){printf("n != (avframe->width * avframe->height / 4)\n");goto end;}// 读取v分量n = fread(avframe->data[2], sizeof(uint8_t), avframe->width * avframe->height / 4, in_fp);if ((int)n != (avframe->width * avframe->height / 4)){printf("n != (avframe->width * avframe->height / 4)\n");goto end;}avpacket = av_packet_alloc();if (!avpacket){printf("av_packet_alloc error\n");goto end;}encoder = avcodec_find_encoder(AV_CODEC_ID_MJPEG);if (!encoder){printf("avcodec_find_encoder error\n");goto end;}encoder_ctx = avcodec_alloc_context3(encoder);if (!encoder_ctx){printf("avcodec_alloc_context3 error\n");goto end;}// encoder_ctx->colorspace = ;// encoder_ctx->color_range = ;encoder_ctx->pix_fmt = AV_PIX_FMT_YUVJ420P;encoder_ctx->width = width;encoder_ctx->height = height;encoder_ctx->framerate.num = 25;encoder_ctx->framerate.den = 1;encoder_ctx->time_base.num = 1;encoder_ctx->time_base.den = 25;encoder_ctx->bit_rate = frame_bytes * encoder_ctx->framerate.num * 8;ret = avcodec_open2(encoder_ctx, encoder, nullptr);if (ret < 0){printf("avcodec_open2 error:%s\n", GetFfmpegERR(ret));goto end;}out_fp = fopen(outfile, "wb");if (!out_fp){printf("avcodec_alloc_context3 error\n");goto end;}ret = avcodec_send_frame(encoder_ctx, avframe);if (ret < 0){printf("avcodec_send_frame error:%s\n", GetFfmpegERR(ret));goto end;}while (1){ret = avcodec_receive_packet(encoder_ctx, avpacket);if (ret < 0){printf("avcodec_receive_packet error:%s\n", GetFfmpegERR(ret));break;}n = fwrite(avpacket->data, sizeof(uint8_t), avpacket->size, out_fp);}end:if (avpacket){av_packet_free(&avpacket);avpacket = nullptr;}if (avframe){av_frame_free(&avframe);avframe = nullptr;}if (out_fp){fclose(out_fp);out_fp = nullptr;}if (encoder_ctx){avcodec_free_context(&encoder_ctx);encoder_ctx = nullptr;}if (in_fp){fclose(in_fp);in_fp = nullptr;}
}
performance

相关文章:
ffmpeg使用mjpeg把yuvj420p编码为jpg图像
version #define LIBAVUTIL_VERSION_MAJOR 58 #define LIBAVUTIL_VERSION_MINOR 12 #define LIBAVUTIL_VERSION_MICRO 100 node 不使用AVOutputFormat code void CFfmpegOps::EncodeYUVJ420pToMJPEG(const char* infile, const char* width_str, const char* height_s…...
龙迅#LT6911GXC支持HDMI2.1转MIPI/4PORT LVDS应用功能,分辨率高达8K30HZ/4K120HZ压缩格式。
1. 描述 该LT6911GXC是一款高性能HD-DVI2.1转MIPI或LVDS芯片,适用于VR/显示应用。 HDCP RX作为HDCP中继器的上游,可以与其他芯片的HDCP TX配合实现中继器功能。 对于 HD-DVI2.1 输入,LT6911GXC可以配置为 3/4 通道。 对于MIPI输出,…...
.NET 6.0 Web API项目中实现基于Token的身份验证
本文以一个完整的示例,展示如何在.NET 6.0 Web API项目中实现基于Token的身份验证。这个例子包括了如何创建和验证JWT Token,以及如何在控制器中使用这些Token。 步骤 1: 创建Web API项目 首先,用Visual Studio 2022创建一个基于.NET6.0的 …...
Java常用对象的快速初始化
在Java中,有多种方式来快速初始化各种常用对象,如字符串数组(String[]),集合列表(List),映射表(Map),以及集合(Set)。不同…...
逻辑回归模型模拟实现:从零开始
引言 逻辑回归是一种用于二分类问题的机器学习算法。尽管它的名字中有“回归”,但它实际上是用于分类的。在本文中,我们将通过模拟数据来演示逻辑回归模型的实现。 逻辑回归简介 逻辑回归通过使用逻辑函数(通常是Sigmoid函数)将…...
Docker基本使用和认识
目录 基本使用 镜像仓库 镜像操作 Docker 如何实现镜像 1) namespace 2) cgroup 3) LXC Docker常见的网络类型 bridge网络如何实现 基本使用 镜像仓库 镜像仓库登录 1)docker login 后面不指定IP地址,则默认登录到 docker hub 上 退出 2)docker logo…...
Halcon 文本文件操作,形态学
一文件的读写 *******************************************************向文本文件写入字符串内容*************************************************************read_image (Image, fabrik)threshold (Image, Region, 0, 120)area_center (Region, Area, Row, Column)open_…...
【鸿蒙】稍微理解一下Stage模型
鸿蒙的Stage模型是HarmonyOS多端统一的应用开发框架中的一个核心概念,用于描述应用的界面层次结构和组件之间的关系。下面将详细解析Stage模型的主要组成部分和特点: 模型组成: UIAbility组件:这是应用中负责绘制用户界面的组件&a…...
毕业答辩制作PPT【攻略】
毕业答辩制作PPT【攻略】 前言版权毕业答辩制作PPT【攻略】一、WPS AI 15天免费会员二、AI文档生成PPT三、修改完善PPT 最后 前言 2024-06-14 23:43:05 以下内容源自《【攻略】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN…...
深入解析npm install --save-dev:开发依赖管理的艺术
npm(Node Package Manager)是JavaScript编程语言的包管理器,用于管理项目中的依赖关系。在开发过程中,合理地管理依赖是保证项目可维护性和可扩展性的关键。npm install命令是npm中最常用的命令之一,而--save-dev参数则…...
福布斯 AI 50 榜单中唯一开源向量数据库:Weaviate
本篇文章,聊聊福布斯全球网站前俩月发布的 2023 AI 50 榜单中的唯一一个开源的向量数据库:Weaviate。 它在数据持久化和容错性上表现非常好、支持混合搜索、支持水平扩展,同时又保持了轻量化。官方主打做 AI 时代的原生数据库,减…...
信息学奥赛初赛天天练-38-CSP-J2021阅读程序-约数个数、约数和、埃氏筛法、欧拉筛法筛素数应用
PDF文档公众号回复关键字:20240628 2021 CSP-J 阅读程序3 1阅读程序(判断题1.5分 选择题3分 共计40分 ) 01 #include<stdio.h> 02 using namespace std; 03 04 #define n 100000 05 #define N n1 06 07 int m; 08 int a[N],b[N],c[N],d[N]; 09 int f[N],g[N]; 10 11 …...
第100+13步 ChatGPT学习:R实现决策树分类
基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言,不想学Python咯。 答曰:可!用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了,就帮各位搬运一下吧。 二、R代码实现决策树分类 (…...
Hi3861 OpenHarmony嵌入式应用入门--LiteOS MessageQueue
CMSIS 2.0接口中的消息(Message)功能主要涉及到实时操作系统(RTOS)中的线程间通信。在CMSIS 2.0标准中,消息通常是通过消息队列(MessageQueue)来进行处理的,以实现不同线程之间的信息…...
ffmpeg编码图象时报错Invalid buffer size, packet size * < expected frame_size *
使用ffmpeg将单个yuv文件编码转为jpg或其他图像格式时,报错: Truncating packet of size 11985408 to 3585 [rawvideo 0x1bd5390] Packet corrupt (stream 0, dts 1). image_3264_2448_0.yuv: corrupt input packet in stream 0 [rawvideo 0x1bd7c60…...
解决类重复的问题
1.针对AndroidX 类重复问题 解决办法: android.useAndroidXtrue android.enableJetifiertrue2.引用其他sdk出现类重复的问题解决办法:configurations {all { // You should exclude one of them not both of themexclude group: "com.enmoli"…...
使用 shell 脚本 统计app冷启动耗时
下面是一个 shell 脚本,它使用 参数将包名称作为参数--app,识别相应应用程序进程的 PID,使用 终止该进程adb shell kill,最后使用 重新启动该应用程序adb shell am start: #!/bin/bash# Check if package name is pro…...
使用容器部署redis_设置配置文件映射到本地_设置存储数据映射到本地_并开发java应用_连接redis---分布式云原生部署架构搭建011
可以看到java应用的部署过程,首先我们要准备一个java应用,并且我们,用docker,安装一个redis 首先我们去start.spring.io 去生成一个简单的web项目,然后用idea打开 选择以后下载 放在这里,然后我们去安装redis 在公共仓库中找到redis . 可以看到它里面介绍说把数据放到了/dat…...
第五节:如何使用其他注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)
大家好,我是网创有方,上节我们实践了通过Bean方式声明Bean配置。咱们这节通过Component和ComponentScan方式实现一个同样功能。这节实现的效果是从IOC中加载Bean对象,并且将Bean的属性打印到控制台。 第一步:创建pojo实体类studen…...
Paragon NTFS与Tuxera NTFS有何区别 Mac NTFS 磁盘读写工具选哪个好
macOS系统虽然以稳定、安全系数高等优点著称,但因其封闭性,不能对NTFS格式磁盘写入数据常被人们诟病。优质的解决方案是使用磁盘管理软件Paragon NTFS for Mac(点击获取激活码)和Tuxera NTFS(点击获取激活码࿰…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
