FFMPEG AVFrame AVPacket内存管理相关API说明

        AVFrame和AVPacket是ffmpeg中保存音视频数据的结构体,AVFrame保存未压缩的原始音视频数据,AVPacket保存编码后的音视频数据,AVFrame和AVPacket都是使用引用计数进行的内存管理。

一、AVFrame

内存分配:

         视频:

AVFrame* frame = av_frame_alloc();
frame->width = 1920;
frame->height = 1080;
frame->format = AV_PIX_FMT_YUV420P;


            音频:

AVFrame* pcm = av_frame_alloc();
pcm->format = outSampleFmt;//位深 16/32位
pcm->channels = channels;
pcm->channel_layout = av_get_default_channel_layout(channels);
pcm->nb_samples = nbSample;//样本数
AVFrame *av_frame_clone(const AVFrame *src);//作用同av_frame_ref类似,增加src的引用计数,但同时会初始化av_frame_clone 对象

        AVFrame buf内存分配:

av_frame_get_buffer(AVFrame *frame, int algin);

        AVFrame 释放:

void av_frame_free(AVFrame** frame)

        音视频内存操作相关API:

        其中AVPicture,av_image_* 的函数就是涉及到了保存视频帧的方式;av_samples_*的函数则涉及了如何保存音频数据。

typedef struct AVPicture {attribute_deprecateduint8_t *data[AV_NUM_DATA_POINTERS];    ///< pointers to the image data planesattribute_deprecatedint linesize[AV_NUM_DATA_POINTERS];     ///< number of bytes per line
} AVPicture;

        下面API中的align一般设置为1,按实际字节存储。

1、视频buf操作:

void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4],const uint8_t *src_data[4], const int src_linesizes[4],enum AVPixelFormat pix_fmt, int width, int height)//根据图像的宽、高、像素格式,进行图像拷贝int av_image_copy_to_buffer(uint8_t *dst, int dst_size,const uint8_t * const src_data[4],const int src_linesize[4],enum AVPixelFormat pix_fmt,int width, int height, int align)//把图像数据拷贝到指定缓冲区:int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align);//函数的作用是通过指定像素格式、图像宽、图像高来计算所需的内存大小int av_image_alloc(uint8_t *pointers[4], int linesizes[4],int w, int h, enum AVPixelFormat pix_fmt, int align);//根据宽高、格式分配buf,尝试使用av_freep(&pointers[0]释放,否则可能内存泄漏int avpicture_fill(AVPicture *picture, const uint8_t *ptr,enum AVPixelFormat pix_fmt, int width, int height);//尝试使用av_freep(&pointers[0]释放,否则可能内存泄漏,这个API在新版本弃用eg:avpicture_fill((AVPicture *)frame, (const uint8_t *)ptr,(enum AVPixelFormat)frame->format, in_width, in_height);int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4],const uint8_t *src, enum AVPixelFormat pix_fmt, int width, int height, int align);//avpicture_fill的替代API,avpicture_fill()就是调用av_image_fill_arrays实现的

2、音频buf操作:

        buf分配:视频帧最多有4个分量,音频帧只需要一个linesize而略有变化,其本质是完全相同的。

int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset,int src_offset, int nb_samples, int nb_channels,enum AVSampleFormat sample_fmt)//音频帧拷贝av_samples_copy_to_buffer:音频没有这个函数int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align);//获取音频帧缓冲区大小int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels,int nb_samples, enum AVSampleFormat sample_fmt, int align);//根据通道数、样本个数,采样格式分配bufint av_samples_fill_arrays(uint8_t **audio_data, int *linesize,const uint8_t *buf, int nb_channels, int nb_samples,enum AVSampleFormat sample_fmt, int align)//同av_image_fill_arraysint av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels,int nb_samples, enum AVSampleFormat sample_fmt, int align)//av_samples_alloc()和av_samples_alloc_array_and_samples()函数都是用于分配存储音频数据的空间int av_samples_set_silence(uint8_t **audio_data, int offset,int nb_samples,int nb_channels,enum AVSampleFormat sample_fmt);//以静音数据填充缓冲区

二、AVPacket

        av_free_packet其实就是清空pkt中data以及buf的内容,并没有把pkt的指针清空,我们可以看到其函数内部调用了av_buffer_unref。

void av_free_packet(AVPacket *pkt)
{if (pkt) {if (pkt->buf)av_buffer_unref(&pkt->buf);pkt->data            = NULL;pkt->size            = 0;av_packet_free_side_data(pkt);}
}

        而av_packet_free是先把pkt中的内容清空,然后再把指针清空,让pkt彻底无法使用了,如果需要重新使用,需要重新分配内存。

void av_packet_free(AVPacket **pkt)
{if (!pkt || !*pkt)return;av_packet_unref(*pkt);av_freep(pkt);
}

        其他API:

void av_packet_ref(AVPacket *dst, const AVPacket *src)void av_init_packet(AVPacket *pkt);//初始化packet的值为默认值,该函数不会影响data引用的数据缓存空间和size,需要单独处理。int av_new_packet(AVPacket *pkt, int size);//av_init_packet的增强版,不但会初始化字段,还为data分配了存储空间AVPacket *av_packet_alloc(void);//创建一个AVPacket,将其字段设为默认值(data为空,没有数据缓存空间)。void av_packet_free(AVPacket **pkt);//释放使用av_packet_alloc创建的AVPacket,如果该Packet有引用计数(packet->buf不为空),则先调用av_packet_unref。AVPacket *av_packet_clone(const AVPacket *src);//其功能是av_packet_alloc和av_packet_refint av_copy_packet(AVPacket *dst, const AVPacket *src);//复制一个新的packet,包括数据缓存废弃 int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src);//初始化一个引用计数的packet,并指定了其数据缓存
替换接口: int av_packet_copy_props(AVPacket *dst, const AVPacket *src);int av_grow_packet(AVPacket *pkt, int grow_by);//增大Packet->data指向的数据缓存void av_shrink_packet(AVPacket *pkt, int size);//减小Packet->data指向的数据缓存int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size)//通过压缩数据来初始化一个引用计数的AVPacket(pkt必须是创建好的),一般在读取流媒体时使用,因为解码函数的参数必须是AVPacketint av_buffer_get_ref_count (const AVBufferRef *buf)//获取引用个数

三、其他

av_get_pix_fmt_name(AVPixelFormat) //获取视频像素格式名称字符串
av_get_sample_fmt_name(AVSampleFormat) //获取音频格式名称字符串

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

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

相关文章

iOS——【CGD】

GCD 什么是GCD GCD指的是Grand Central Dispatch&#xff0c;它是苹果公司开发的一套多线程编程技术。GCD提供了一种简单而有效的方式来管理应用程序中的并发任务。它通过将任务提交到适当的队列&#xff08;串行队列或并发队列&#xff09;来管理并发执行的任务&#xff0c;…

WebAR开发简介

WebAR 开发使企业能够以独特且高度有趣的方式向客户和员工提供信息。 它提供增强现实 (AR) 内容&#xff0c;人们在智能手机上将其视为视觉叠加。 然而&#xff0c;WebAR 可在手机的普通网络浏览器上运行&#xff0c;无需下载任何应用程序。 WebAR 的多种用途包括帮助零售和在…

跟张良均老师学大数据人工智能——数据挖掘集训营开营

集训营特色&#xff1a; 知识点深入浅出&#xff0c;实现以学促用 以业务内容为主线&#xff0c;数据挖掘技能嵌入 多行业项目实战&#xff0c;全面提升职业素养 全程线上辅导&#xff0c;助力熟练掌握技能 惊喜优惠&#xff1a; 限时“六折”&#xff01; 师傅带练 方向…

docker centos7离线安装ElasticSearch单机版

目录 1.下载ES并解压2.新建elasticsearch用户3.修改ES配置文件4.启动ES服务5.设置开机启动 本文以 elasticsearch-7.8.1为例。 1.下载ES并解压 cd /root/install wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz tar -z…

Qt|读写数据库管理图片资源工具

文章目录 创建项目设置UI布局控制数据库类实现界面实现类主函数 功能&#xff1a;用来管理数据库中图像资源 开发环境&#xff1a;windows10VS2017Qt5.14.2开发 创建项目 首先创建Qt Widgets Application next->next->finish就创建好了 设置UI布局 打开已经创建好的U…

笔记本如何调节亮度?笔记本亮度调节方法

对于经常长时间面对笔记本电脑的小伙伴们来说&#xff0c;屏幕亮度过暗或者过亮&#xff0c;都会对眼睛造成伤害。那么&#xff0c;我们如何调节笔记本亮度至适中呢?下面为大家介绍3种简单的调节屏幕亮度的方法&#xff0c;一起来看看吧! 笔记本亮度调节方法一&#xff1a; 1、…

Amuse:.NET application for stable diffusion

目录 Welcome to Amuse! Features Why Choose Amuse? Key Highlights Paint To Image Text To Image Image To Image Image Inpaint Model Manager Hardware Requirements Compute Requirements Memory Requirements System Requirements Realtime Requirements…

Electron 入门 - 创建应用的全流程 - npm 踩坑版

说明 本文记录一下&#xff0c;使用Electron创建一个简单的客户端应用的全流程。 在官方文档的基础上&#xff0c;针对依赖安装过程中出现的异常&#xff0c;进行了补充&#xff0c;确保可以正常的创建应用。 创建步骤 0、校验node版本 官方文档建议使用 最新版本的 NodeJS …

Codigger用户篇:安全、稳定、高效的运行环境(一)

在当今数字化时代&#xff0c;个人数据的安全与隐私保护显得尤为重要。为了满足用户对数据信息的安全需求&#xff0c;我们推出Codigger分布式操作系统&#xff0c;它提供了一个运行私有应用程序的平台&#xff0c;旨在为用户提供一个安全、稳定、高效的私人应用运行环境。Codi…

html 元素宽度自适应 占据剩余宽度

弹性盒实现 父元素设置display: flex; 需要自适应宽度的子元素设置flex: 1; <html lang"en"> <head><style>*{margin: 0;padding: 0;}.main{display: flex;}.box1,.box2{width: 100px;height: 200px;}.box1{background: rgb(134 187 233);}.box2…

【javaWeb 第五篇】后端-Http协议学习

HTTP协议 HTTP概述HTTP-请求数据格式HTTP响应格式HTTP-协议解析 HTTP概述 Hyper Text Transfer Protocol,超文本传输协议&#xff0c;规定了浏览器和服务器之间的数据传输规则 简述概念就是&#xff0c;浏览器需要向服务器发送请求&#xff0c;想要得到服务器中的数据&#xff…

2014年认证杯SPSSPRO杯数学建模B题(第一阶段)位图的处理算法全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 B题 位图的处理算法 原题再现&#xff1a; 图形&#xff08;或图像&#xff09;在计算机里主要有两种存储和表示方法。矢量图是使用点、直线或多边形等基于数学方程的几何对象来描述图形&#xff0c;位图则使用像素来描述图像。一般来说&#…

React组件如何通信

组件之间的通信,有四种类型: 父组件向子组件传递子组件向父组件传递兄弟组件之间传递父组件向子组件传递 由于React有单向数据流动的特性,所以父组件向子组件传递是最常见的方式。 父组件在调用子组件的时候,在组件标签内传递参数,子组件通过props属性获取父组件传递过来…

Share-ChatGPT官网UI/文件上传/联网搜索/GPTS 一并同步

地址&#xff1a;Share-ChatGPT 文章目录 界面UI&#xff0c;GPTS&#xff0c;读论文&#xff0c;数据分析&#xff0c;写论文视频演示仓库地址 界面 支持多账号同时管理&#xff0c;合理利用资源&#xff1a; UI&#xff0c;GPTS&#xff0c;读论文&#xff0c;数据分析&a…

【node】Missing script start or file server.js

错误 项目中没有找到启动脚本 start 或者 server.js 文件。pnpm start 命令默认会去寻找 start 脚本或者 server.js 文件来启动应用&#xff0c;但是在你的项目中没有找到这些文件&#xff0c;所以报错了。 $ pnpm startERR_PNPM_NO_SCRIPT_OR_SERVER  Missing script start…

论文篇06-论文范文-论基于架构的软件设计方法ABSD及应用(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

试题 试题:论基于架构的软件设计方法(ABSD)及应用 基于架构的软件设计(Architecture-Based Software Design,ABSD)方法以构成软件架构的商业、质量和功能需求等要素来驱动整个软件开发过程。ABSD是一个自顶向下,递归细化的软件开发方法,它以软件系统功能的分解为基础…

Springboot vue elementui 在线考试系统案例源码

Springboot vue elementui 在线考试系统案例源码 链接地址

Go语言学习Day3:数据类型、运算符与流程控制

名人说&#xff1a;莫愁千里路&#xff0c;自有到来风。 ——钱珝 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、数据类型①布尔类型②整型③浮点型④string⑤类型转换 2、运算符①算术运算符②逻辑运算符③关…

基于微信小程序电影院订票选座系统 (后台JSP+JDBC+Mysql)答辩常规问题和如何回答(答辩指导)

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

竞赛 python 爬虫与协同过滤的新闻推荐系统

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python 爬虫与协同过滤的新闻推荐系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&…