ffmpeg使用mjpeg把yuvj420p编码为jpg图像

version

#define LIBAVUTIL_VERSION_MAJOR  58

#define LIBAVUTIL_VERSION_MINOR  12

#define LIBAVUTIL_VERSION_MICRO 100

note

1.

通过*.jpg推测时,out_fmt为image2,打开*.jpg文件时,in_fmt为image2

但是out_fmt为image2时,av_write_frame调用失败

2.

指定short_name为mjpeg,out_fmt为mjpeg

av_write_frame调用成功

code

void CFfmpegOps::EncodeYUVJ420pToMJPEG(const char *infile, const char *width_str, const char *height_str)
{if (!infile){return;}int32_t width = 0;int32_t height = 0;try{width = std::stoi(width_str);height = std::stoi(height_str);}catch (std::exception& e){return;}#if 0size_t data_bytes = width * height * 3 / 2;std::shared_ptr<uint8_t> data(new uint8_t[data_bytes]);
#endifFILE *in_fp = nullptr;size_t n = 0;AVCodecContext *encoder_ctx = nullptr;const AVCodec *encoder = nullptr;const char *outfile = nullptr;int ret = -1;AVFormatContext *out_fmt_ctx = nullptr;AVStream *mjpeg_stream = nullptr;const AVOutputFormat *out_fmt = nullptr;AVFrame *avframe = nullptr;AVPacket *avpacket = nullptr;int frame_bytes = 0;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);
#if 0if ((int)data_bytes != frame_bytes){printf("data_bytes != frame_bytes\n");goto end;}
#endifret = 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;}#if 0n = fread(data.get(), sizeof(uint8_t), data_bytes, in_fp);if (n != data_bytes){printf("n != data_bytes\n");goto end;}ret = av_image_fill_arrays(avframe->data, avframe->linesize,data.get(),encoder_ctx->pix_fmt, encoder_ctx->width, encoder_ctx->height, 1);if (ret < 0){printf("av_image_fill_arrays error:%s\n", GetFfmpegERR(ret));goto end;}else{printf("ret:%d, frame_bytes:%d\n", ret, frame_bytes);}
#endifavpacket = 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_fmt_ctx = avformat_alloc_context();if (!out_fmt_ctx){printf("avformat_alloc_context error\n");goto end;}outfile = "image_%03d.jpg";
#if 0/*通过*.jpg推测时,out_fmt为image2,打开*.jpg文件时,in_fmt为image2但是out_fmt为image2时,av_write_frame调用失败*/out_fmt = av_guess_format(nullptr, outfile, nullptr);if (!out_fmt){printf("av_guess_format error\n");goto end;}
#else/*指定short_name为mjpeg,out_fmt为mjpegav_write_frame调用成功*/out_fmt = av_guess_format("mjpeg", nullptr, nullptr);if (!out_fmt){printf("av_guess_format error\n");goto end;}
#endifout_fmt_ctx->oformat = out_fmt;mjpeg_stream = avformat_new_stream(out_fmt_ctx, encoder);if (!mjpeg_stream){printf("avformat_new_stream error\n");goto end;}ret = avcodec_parameters_from_context(mjpeg_stream->codecpar, encoder_ctx);if (ret < 0){printf("avcodec_parameters_from_context error:%s\n", GetFfmpegERR(ret));goto end;}#if 0ret = avio_open(&(out_fmt_ctx->pb), outfile, AVIO_FLAG_WRITE);if (ret < 0){printf("avio_open error:%s\n", GetFfmpegERR(ret));goto end;}
#elseret = avio_open2(&(out_fmt_ctx->pb), outfile, AVIO_FLAG_READ_WRITE, nullptr, nullptr);if (ret < 0){printf("avio_open2 error:%s\n", GetFfmpegERR(ret));goto end;}
#endifret = avformat_write_header(out_fmt_ctx, nullptr);if (ret < 0){printf("avformat_write_header error:%s\n", GetFfmpegERR(ret));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;}avpacket->time_base.num = encoder_ctx->time_base.num;avpacket->time_base.den = encoder_ctx->time_base.den;#if 0ret = av_interleaved_write_frame(out_fmt_ctx, avpacket);if (ret < 0){printf("av_interleaved_write_frame error:%s\n", GetFfmpegERR(ret));break;}
#elseret = av_write_frame(out_fmt_ctx, avpacket);if (ret < 0){printf("av_write_frame error:%s\n", GetFfmpegERR(ret));break;}
#endif}// 写元数据ret = av_write_trailer(out_fmt_ctx);if (ret < 0){printf("av_write_trailer error:%s\n", GetFfmpegERR(ret));goto end;}end:if (avpacket){av_packet_free(&avpacket);avpacket = nullptr;}if (avframe){av_frame_free(&avframe);avframe = nullptr;}if (out_fmt_ctx->pb){avio_close(out_fmt_ctx->pb);out_fmt_ctx->pb = nullptr;}if (out_fmt_ctx){avformat_free_context(out_fmt_ctx);out_fmt_ctx = nullptr;}if (encoder_ctx){avcodec_free_context(&encoder_ctx);encoder_ctx = nullptr;}if (in_fp){fclose(in_fp);in_fp = nullptr;}
}

perfomance

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

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

相关文章

web项目打包成可以离线跑的exe软件

目录 引言打开PyCharm安装依赖创建 Web 应用运行应用程序打包成可执行文件结语注意事项 引言 在开发桌面应用程序时&#xff0c;我们经常需要将网页集成到应用程序中。Python 提供了多种方法来实现这一目标&#xff0c;其中 pywebview 是一个轻量级的库&#xff0c;它允许我们…

滑动窗口算法——部分OJ题详解

目录 关于滑动窗口 部分OJ题详解 209.长度最小的子数组 3.无重复字符的最长字串 1004.最大连续1的个数Ⅲ 1658.将x减到0的最小操作数 904.水果成篮 438.找到字符串中所有字母异位词 30.串联所有单词的子串 76.最小覆盖子串 关于滑动窗口 其实滑动窗口也是通过双指针…

存储引擎MyISAM和InnoDB

目录 一、存储引擎概述 1.存储引擎概念 2.存储引擎分类 3.选择存储引擎的原则 二、InnoDB 存储引擎 三、MyISAM 存储引擎 四、实验操作 一、存储引擎概述 1.存储引擎概念 数据库存储引擎是数据库底层软件组件&#xff0c;数据库管理系统使用数据库引擎进行创建&#x…

Spring Boot中如何处理异步任务

Spring Boot中如何处理异步任务 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨在Spring Boot应用中如何处理异步任务&#xff0c;以提升系统的性…

Nuxt 的异步数据处理(八)

Nuxt.js 扩展了 Vue.js&#xff0c;增加了一个叫 asyncData 的方法&#xff0c;使得我们可以在设置组件的数据之前能异步获取或处理数据。 asyncData 方法 Nuxt.js 提供了几种不同的方法来使用 asyncData 方法&#xff0c;你可以选择自己熟悉的一种来用&#xff1a; 返回一个…

CMS垃圾回收过程中重新标记阶段为什么不能清理浮动垃圾

因为在并发标记时&#xff0c;因为是 GC 和用户线程是并发执行的&#xff0c;可能导致一部分已经标记为 从 GC Roots 不可达 的对象&#xff0c;若该对象在用户线程的修改下又可达了&#xff0c;Remark 的作用就是将这部分对象又标记为 可达对象&#xff08;漏标&#xff09;。…

Double 4 VR虚拟情景智能互动系统在小语种专业课堂上的应用

随着科技的进步&#xff0c;越来越多的教育机构开始尝试使用虚拟现实技术来提高教学效果。Double 4 VR虚拟情景智能互动系统就是这样一款能够为小语种专业课堂带来革新性体验的教学工具。 一、模拟真实环境&#xff0c;增强学习体验 系统通过高度仿真的虚拟环境&#xff0c;为学…

Git(涵盖GitHub\Gitee码云\GitLab)

Git(涵盖GitHub\Gitee码云\GitLab) 文章目录 Git(涵盖GitHub\Gitee码云\GitLab)课程介绍Git概述官网介绍版本控制介绍两种版本控制工具集中式版本控制工具分布式版本控制工具 Git工作机制代码托管中心 Git安装和客户端的使用Git常用命令设置用户签名初始化本地库查看本地库状态…

C++——string类用法指南

一、前言 在C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&#xff0c;稍…

性能飞跃:深度优化IntelliJ IDEA的实战指南

性能飞跃&#xff1a;深度优化IntelliJ IDEA的实战指南 IntelliJ IDEA&#xff0c;作为Java开发者的首选IDE&#xff0c;以其强大的功能和智能化的代码辅助而闻名。然而&#xff0c;随着项目规模的增长&#xff0c;IDE的性能可能会成为瓶颈。本文将提供一份详尽的优化指南&…

C++编译时引入json/nlohmann文件报错

报错信息: In file included from /home/chenlang/catkin_ws/src/leanrning_communication/src/mysql/../utils/data.h:14:0,from /home/chenlang/catkin_ws/src/leanrning_communication/src/mysql/MyRobotDb.h:32,from /home/chenlang/catkin_ws/src/leanrning_communicatio…

学校选用SOLIDWORKS教育版进行授课的理由

在当代的工程与技术教育领域&#xff0c;计算机辅助设计软件&#xff08;CAD&#xff09;已经变成了一个不可缺少的教学辅助工具。SOLIDWORKS作为一个功能齐全且用户友好的CAD软件&#xff0c;其教育版本在学校教学环境中受到了广泛的欢迎。本文将对学校教学中选用SOLIDWORKS版…

eclipse基础工程配置( tomcat配置JRE环境)

文章目录 I eclipse1.1 工程配置1.2 编译工程1.3 添加 JRE for the project build pathII tomcat配置JRE环境2.1 Eclipse编辑tomcat运行环境(Mac版本)2.2 Eclipse编辑tomcat运行环境(windows版本)2.3 通过tomcat7W.exe配置运行环境(windows系统)I eclipse 1.1 工程配置 …

【motan rpc 懒加载】异常

文章目录 升级版本解决问题我使用的有问题的版本配置懒加载错误的版本配置了懒加载 但是不生效 lazyInit"true" 启动不是懒加载 会报错一次官方回复 升级版本解决问题 <version.motan>1.2.1</version.motan><dependency><groupId>com.weibo…

iOS 账号上传IPA包时警告:Potential Loss of Keychain Access

APP迭代时&#xff0c;使用transporter交付应用IPA包报警告Potential Loss of Keychain Access 原因是之前从旧账号中转让APP到当前的新账号中&#xff0c;标识符发生了改变。 报错信息&#xff1a; WARNING ITMS-90076: “Potential Loss of Keychain Access. The previou…

5G VONR

转载&#xff1a;VoNR呼叫流程介绍 (baidu.com) 使用5G RAN、5G Core和IMS的语音服务被称为新无线电VoNR上的语音&#xff0c;5G提供语音/视频通话等服务。 NR网络架构上的语音 NR语音网络体系结构由5G RAN、5G Core和IMS网络组成。下面显示了一个体系结构。&#xff08;仅包…

python3.12 Class str详解

字符串作为计算里面一个重要的对象&#xff0c;在Python的实现是通过定义类来描述它的。这是一篇字典式的文章&#xff0c;我们详细描述字符串实例的各个办法。 一&#xff1a; 实例化的办法&#xff1a;‘’。比如&#xff1a; spython二&#xff1a;字符串类的办法。&#x…

3.x86游戏实战-寄存器

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;2.x86游戏实战-跨进程读取血量 寄存器说明&#xff1a; 寄存器是处理器的一部&…

Windows部署MinIO,搭建本地对象存储服务

一、前言 二、MinIO介绍 三、Windows部署MinIO服务 1、准备工作 2、下载MinIO服务 3、启动MinIO服务 4、设置用户名密码 5、创建.bat文件启动服务 四、MinIO基本操作 1、存储桶管理 2、对象管理 3、数据查看 一、前言 基于外网的项目&#xff0c;可以使用阿里云等…

ActiViz 9.3实战:ActiViz集成到WPF中的空域问题

文章目录 一、场景1、WPF控件2、集成ActiViz或者VTK二、问题1、需求2、空域问题三、解决方案1、用WindowsFormsHost包裹住ElementHost,然后将WPF的控件放在ElementHost职中:2、用Window或者Popup去悬浮3、使用第三方库Microsoft.DwayneNeed(这也是网上出现较多的答案)四、最…