在ffmpeg中,如何把h264转换为rgb格式

在这里插入图片描述

在ffmpeg中,网络视频流h264为什么默认的转为YUV而不是其他格式 文章中介绍了,h264解码的时候是直接解码为yuv的,如果在使用的过程中 需要用到rgb的格式,我们该如何来转换这种格式呢?

在上面的文章中,我们已经知道了ffmpeg中,使用avcodec_send_packetavcodec_receive_frame 对h264进行了解码,这时候编码已经 变为yuv了。

那问题就变为了,如何把yuv格式转变为rgb。对于yuv和rgb来说,这两种只是格式的不同而已,映射空间的不同,也就是说,通过映射,我们可以把yuv转换为rgb。

ffmpeg中,通过空间的转换,使用到的函数是:sws_getContextsws_scale

代码如下:

AVFrame* decode_to_rgb(AVFrame* frame) {// 创建一个swsContext,用于YUV到RGB的转换SwsContext* swsContext = sws_getContext(frame->width, frame->height, (AVPixelFormat)frame->format,frame->width, frame->height, AV_PIX_FMT_RGB24,SWS_BILINEAR, NULL, NULL, NULL);if (!swsContext) {// 错误处理...}// 创建一个新的AVFrame,用于存储RGB数据AVFrame* rgbFrame = av_frame_alloc();rgbFrame->format = AV_PIX_FMT_RGB24;rgbFrame->width = frame->width;rgbFrame->height = frame->height;av_frame_get_buffer(rgbFrame, 0);// 将YUV数据转换为RGBsws_scale(swsContext, frame->data, frame->linesize, 0, frame->height,rgbFrame->data, rgbFrame->linesize);// 释放swsContextsws_freeContext(swsContext);return rgbFrame;
}

通过上面的程序,我们可以知道,yuv和rgb的数据,是存在frame->data中的,每个frame代表了一帧,也就是代表了一张图片,在上一篇文章中,如果你还记得的话,那么h264的数据是放在AVPacket中的。

既然每一帧是一张图片,我们能不能也把AVFrame 编码为jpg的图片,这是可以的。

bool yuv_to_jpeg(void* framev) {AVFrame* frame = (AVFrame*)framev;const AVCodec* jpegCodec = avcodec_find_encoder(AV_CODEC_ID_MJPEG);if (!jpegCodec) {return false;}AVCodecContext* jpegContext = avcodec_alloc_context3(jpegCodec);if (!jpegContext) {return false;}jpegContext->pix_fmt = AV_PIX_FMT_YUVJ420P;jpegContext->height = frame->height;jpegContext->width = frame->width;jpegContext->time_base.den = 20;jpegContext->time_base.num = 1;if (frame->height <= 0)return false;int ret = avcodec_open2(jpegContext, jpegCodec, NULL);if (ret < 0) {//char* ret =(char*) av_err2str(ret);return false;}AVPacket* packet;packet = av_packet_alloc();// 发送帧到编码器if (avcodec_send_frame(jpegContext, frame) < 0) {// 错误处理...}if (avcodec_receive_packet(jpegContext, packet) == 0) {// 如果编码器输出了JPEG数据,将其保存到文件FILE* JPEGFile;char JPEGFName[256];static int i = 0;sprintf(JPEGFName, "jpg//dvr-%06d.jpg", ++i);JPEGFile = fopen(JPEGFName, "wb");fwrite(packet->data, 1, packet->size, JPEGFile);fclose(JPEGFile);}av_packet_unref(packet);avcodec_close(jpegContext);return true;
}

因为jpg是一种编码格式,所有会用到avcodec_send_packetavcodec_receive_frame ,编码的内容存在packet中,ffmpeg都帮我们把jpg的格式填充在packet中了,我们只需要把数据直接保存在文件就可以得到图片了。

所有的代码都已在git上。

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

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

相关文章

Nacos全面知识 ----微服务 SpringCloud

快速入门 分级存储模型 修改集群配置 Nacos设置负载均衡策略 集群优先 权重优先 Nacos热更新配置 Nacos添加配置信息 微服务配置拉取 热更新:推荐使用第二种方法进行热部署 ConfigurationProperties(prefix "pattern") 是 Spring Boot 中用于自动配置属性的注解。它…

echarts中 对seriesLayoutBy的理解

https://echarts.apache.org/handbook/zh/concepts/dataset/ ‘row’: 系列被安放到 dataset 的行上面。 这里x轴是目录轴&#xff0c;那么一列就是一个系列 ‘column’: 默认值。系列被安放到 dataset 的列上面。 用自己的话总结就是&#xff1a; 当 seriesLayoutBy 为行时&…

CLion 2023.2.2(C ++ IDE智能代码编辑器)

CLion 2023是一款跨平台C/C集成开发环境&#xff08;IDE&#xff09;。它为Mac用户提供了高效的编程体验&#xff0c;帮助程序员们在Mac平台上进行C/C开发。 CLion 2023支持多种编译器和调试器&#xff0c;并具有强大的代码分析和导航功能。它还为用户提供了许多便捷的工具和插…

【SOC基础】单片机学习案例汇总 Part2:蜂鸣器、数码管显示

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

vi vim 末尾编辑按GA 在最后一行下方新增一行编辑按Go

vim 快速跳到文件末尾 在最后一行下方新增一行 移到末尾,并且进入文本录入模式 GA (大写G大写A) 在一般模式(刚进入的模式,esc模式) GA 或 Shift ga 先 G 或 shiftg 到最后一行 然后 A 或 shifta 到本行末尾 并且进入文本录入模式 在最后一行下方新增一行 (光标换行,文字不…

不会搭建企业网,建议你不要点开这篇文章

中午好&#xff0c;我是老杨。 企业网络搭建一直是网工技术里的基础且重要的部分&#xff0c;一些小白粉丝和我反馈&#xff0c;技术是了解一些&#xff0c;但是整体逻辑搭建不起来。 企业网是很多网工都会面临的一个工作日常环境。 但是&#xff0c;尽管很多人每日接触&…

react-router

一、react-router是什么 react-router是一个用于管理React应用程序中路由的库。路由是指确定应用程序如何根据URL路径来渲染不同的组件和页面。使用react-router可以将应用程序的不同页面映射到不同的URL路径&#xff0c;以及在用户导航时动态地加载适当的组件。这样&#xff…

shardingphere Sharding count cannot be null解决方案

shardingphere Sharding count cannot be null解决方案 问题背景解决方案Lyric&#xff1a; 我知道坚持要走 问题背景 使用shardingphere分表分库时&#xff0c;出现分表算法设置错误 Caused by: java.lang.IllegalArgumentException: Sharding count cannot be null.at com.…

mapbox使用marker创建html点位信息

mapbox使用marker创建html点位信息 codePen地址 mapboxgl.accessToken "pk.eyJ1IjoibGl1emhhbzI1ODAiLCJhIjoiY2xmcnV5c2NtMDd4eDNvbmxsbHEwYTMwbCJ9.T0QCxGEJsLWC9ncE1B1rRw"; const center [121.29786, 31.19365]; const map new mapboxgl.Map({container: &quo…

双十一买电视盒子什么牌子好?拆机达人强推目前性能最好的电视盒子

我这几年拆过的电视盒子已经有40多款了&#xff0c;最近看到网友们在讨论双十一电视盒子怎么挑选&#xff0c;就我拆机的经验来说&#xff0c;有些产品在硬件上存在问题的确较多&#xff0c;不知道双十一买电视盒子什么牌子好&#xff0c;可以参考我整理的目前性能最好的电视盒…

windows 运行 Mysql Command Line Client 自动关闭闪退原因分析

目录 原因分析一 原因分析二 原因分析三 第一次使用 MySQL Command Line Client 有可能输入密码后一按下回车键&#xff0c;程序窗口就自动关闭&#xff0c;出现闪退现象。本节主要分析产生闪退现象的原因以及如何处理这种情况。 原因分析一 首先可以查看程序默认执行文件…

电源管理(PMIC)MAX20428ATIA/VY、MAX20428ATIC/VY、MAX20428ATIE/VY适合汽车ADAS应用的开关稳压器

一、概述 MAX20428是一款高效率、八路输出、低压PMIC。OUT1将输入电源升压至5V&#xff0c;电流高达500mA&#xff0c;而三个同步降压转换器的输入电压范围为3.0V至4.2V&#xff0c;输出电压范围为0.8V至3.9875V&#xff0c;峰值电流分别高达1.3A、1.3A和3.5A。三个300mA pMOS…

团队表 -多级团队设计

团队表 -多级团队设计 user_team团队表 &#xff0c;如果存在子团队 1.我们可以通过每一个团队字段加一个parentid &#xff08;相当于一对多的关系&#xff09; 2.还可以设置一个字段CodingNum,比如这样: //系统为了管理查询团队自动生成的有序编号 可以使用3位数代表一个…

Spring cloud教程Gateway服务网关

Spring cloud教程|Gateway服务网关 写在前面的话&#xff1a; 本笔记在参考网上视频以及博客的基础上&#xff0c;只做个人学习笔记&#xff0c;如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01; Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;…

JS中null和undefined的区别

首先 Undefined 和 Null 都是基本数据类型&#xff0c;这两个基本数据类型分别都只有一个值&#xff0c;就是 undefined 和 null。 undefined 代表的含义是未定义&#xff0c;null 代表的含义是空对象。一般变量声明了但还没有定义的时候会返回 undefined&#xff0c;null主要…

使用HttpClient库的爬虫程序

使用HttpClient库的爬虫程序&#xff0c;该爬虫使用C#来抓取内容。 using System; using System.Net.Http; using System.Threading.Tasks; ​ namespace CrawlerProgram {class Program{static void Main(string[] args){// 创建HttpClient对象using (HttpClient client new…

Ubuntu更新apt-get安装镜像源

前往清华开源镜像站获取镜像链接 修改镜像源&#xff0c;打开配置文件&#xff0c;将镜像源链接粘贴到配置文件 sudo vim /etc/apt/sources.list更新软件列表到本地 sudo apt-get update更新所有软件&#xff08;非必要&#xff09; sudp apt-get upgrade

java入门,程序=数据结构+算法

一、前言 在学习java的时候&#xff0c;我印象最深的一句话是&#xff1a;程序数据结构算法&#xff0c;对于写java程序来说&#xff0c;这就是java的入门。 二、java基本数据结构与算法 1、数据类型 java中的数据类型8种基本数据类型&#xff1a; 整型 byte 、short 、int…

win7中安装node14和vue

下载并安装低版本node 13 到官网去找早期历史版本的 nodejs 13 msi格式即可&#xff0c;并一键安装&#xff0c;我安装在了 D:\Program Files\nodejs 目录下 https://nodejs.org/download/release/v13.14.0/ 下载高版本node 14 下载高版本的node zip包 https://nodejs.org/…

VMware打开centos黑屏解决方法汇总以及解决出现的bug(Centos7系统网络异常等)

VMware打开centos黑屏解决方法汇总 前言&#xff1a;一. VMware打开centos黑屏解决方法汇总一 .情况情况一&#xff1a;情况二情况三 二. 解决方法最简单的方法&#xff1a;一. 以管理员权限在命令行执行1. 管理员身份运行cmd2. 输入“netsh winsock reset”,回车3. 重启电脑即…