[ffmpeg] AVFrame 功能整理

背景

AVFrame 主要用来存储编码前的原始数据。

AVFrame 结构体

在 frame.h 文件中

主要变量

uint8_t *data[AV_NUM_DATA_POINTERS]; // 存储每个 planes 的数据
int linesize[AV_NUM_DATA_POINTERS]; // 每一行的音视频数据
uint8_t **extended_data; // 视频,指向 data, 音频有需要则指向新的地址。由于音频可以支持多个声道,比如 22,data 存不在,则需要放到这里。
int width, height; // 视频宽和高
int nb_samples;  // 音频每个通道的采样数
int format; // 音视频格式  AVPixelFormat  AVSampleFormat
int key_frame; // 是不是关键帧
enum AVPictureType pict_type; // 图片类型
AVRational sample_aspect_ratio; // 宽高比
int64_t pts; // 渲染时间
AVRational time_base; // 时间基
int sample_rate; // 采样率
AVBufferRef *buf[AV_NUM_DATA_POINTERS]; // 实际数据存储地方,data 指针指向这里。通过引用来控制是否释放内存。
AVBufferRef **extended_buf; // 类似 buf,存储 extended_data
AVChannelLayout ch_layout; // 音频通道数

AVFrame 函数

常用函数

av_frame_alloc

作用:分配 AVFrame,并设置默认值,通过 av_frame_free 释放。且不会创建 data buffer,因为此时他还不知道要分配多大的内存。

AVFrame *av_frame_alloc(void);
av_frame_free

释放 AVFrame,并减少动态分配变量的引用计数。

void av_frame_free(AVFrame **frame);
av_frame_ref

拷贝 src 的值到 dst,并增加 buf 和 extended_buf 引用 (为啥引用到1 就删除)

int av_frame_ref(AVFrame *dst, const AVFrame *src);
av_frame_unref

减少引用并重置各字段

void av_frame_unref(AVFrame *frame);	
av_frame_get_buffer

为音视频分配内存,调用这个函数前
视频需要设置:格式、宽和高
音频需要设置:采样格式、声道数、每个声道的音频采样数
否则,不知道要分配多大的内存。

int av_frame_get_buffer(AVFrame *frame, int align);
不常用函数
av_frame_clone

相当于 av_frame_alloc()+av_frame_ref()

AVFrame *av_frame_clone(const AVFrame *src);
av_frame_move_ref

将 src 赋值给 dst

void av_frame_move_ref(AVFrame *dst, AVFrame *src);
av_frame_is_writable

判断 frame 是否可写,ffmpeg 好像认为有多个引用,则不可写。应该是需要加锁才能确保安全。

int av_frame_is_writable(AVFrame *frame);
av_frame_make_writable

让 frame 可写,如果有多个引用frame地址,则重新创建一块内存。

int av_frame_make_writable(AVFrame *frame);
av_frame_copy

只拷贝 src 的 buf 到 dst,需要提前确保两者的 buf 内存一样。

int av_frame_copy(AVFrame *dst, const AVFrame *src);
av_frame_copy_props

只拷贝元信息,应该是只那些辅助信息吧,比如 pts、timebase、sidedata等

int av_frame_copy_props(AVFrame *dst, const AVFrame *src);
av_frame_get_plane_buffer

获取某个 plane 的数据

AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane);
side_data

side_data 相关

AVFrameSideData *av_frame_new_side_data(AVFrame *frame,enum AVFrameSideDataType type,size_t size);
AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,enum AVFrameSideDataType type,AVBufferRef *buf);AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,enum AVFrameSideDataType type);
void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type);
// 返回 sidedata 类型
const char *av_frame_side_data_name(enum AVFrameSideDataType type);
av_frame_apply_cropping

对数据进行裁剪

int av_frame_apply_cropping(AVFrame *frame, int flags);

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

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

相关文章

java实现网络聊天

网络聊天实现步骤(从功能谈论方法): 客户端: 1.登录面板:注册提醒用户注册格式,登录账号密码不为空,点击登录的时候需要连接服务器端,启动聊天面板。(监听用户点击登录…

Windows下nginx的启动,重启,关闭等功能bat脚本

echo off rem 提供Windows下nginx的启动,重启,关闭功能echo begincls ::ngxin 所在的盘符 set NGINX_PATHG:::nginx 所在目录 set NGINX_DIRG:\projects\nginx-1.24.0\ color 0a TITLE Nginx 管理程序增强版CLSecho. echo. ** Nginx 管理程序 *** echo.…

JAVA使用HTTP代码示例

你好,Java开发者们!今天,我要给你们带来一场硬核的盛宴,那就是在Java中使用HTTP协议进行网络通信的代码示例。准备好接受挑战了吗?Lets go! 首先,我们需要导入一些必要的库,它们将成…

C++枚举类

枚举 C11有作用域枚举和无作用域枚举 无作用域枚举 特点 全局作用域:无作用域枚举的成员(枚举值)在包含它们的作用域内是直接可见的,不需要使用枚举类型名称作为前缀。 隐式类型转换:无作用域枚举的成员可以隐式地转换…

鸿蒙开发组件之ForEach列表

一、ForEach函数 ForEach函数是一个迭代函数,需要传递两个必须参数和一个可选参数。主要通过迭代来获取参数arr中的数据不断的生成单个Item来生成鸿蒙中的列表样式 二、先创建单个的Item的UI 通过嵌套Row与Column来实现单个Item的UI。例如图中没有折扣的可以看成一…

用23种设计模式打造一个cocos creator的游戏框架----(八)适配器模式

1、模式标准 模式名称:适配器模式 模式分类:结构型 模式意图:适配器模式的意图是将一个类的接口转换成客户端期望的另一个接口。适配器模式使原本接口不兼容的类可以一起工作。 结构图: 适用于: 系统需要使用现有的…

309. 买卖股票的最佳时机含冷冻期(leetcode) 动态规划思想

文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化边界条件4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中,我们将要详细介绍一下Leetcode中买卖股票的最佳时机含冷冻期相关的内容,本题采用动态规划的思想解决 一、…

uniapp蓝牙传输中文乱码问题

uniapp蓝牙传输中文乱码问题 0 现状 传输数字和字母的json字符串都可以解析,有个中文的硬件那边就解析不了,替换一下发数据的处理函数即可 1 原先字符串转化函数 const stringToBytes (msg) > {const buffer new ArrayBuffer(msg.length)const …

eclipse中一些文件的作用

.idea文件夹 .idea和.settings文件夹是IntelliJ IDEA的配置文件夹,用于存储项目的配置信息。这些文件夹中包含了许多XML文件,这些XML文件包含了项目的各种配置信息,例如编译选项、运行配置、代码样式、版本控制等等。 包含了一些名为modules.…

PyQt6 QDateEdit日期控件

​锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计39条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…

多数元素算法(leetcode第169题)

题目描述: 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:nums [3,2,3] 输出&am…

Python:可以做什么?

简介 Python是一种高级编程语言,因其简单易学、代码可读性强和拥有丰富的标准库而广受欢迎。Python可以用于许多不同领域,主要包括: 数据分析与数据科学:Python有强大的数据处理和分析库,如Pandas、NumPy和SciPy&…

空中消防员:无人机森林防火应用全面升级

森林是生态系统的重要组成部分,也是人类得以生存的关键。我国森林面积广大,存在火灾频发的困境。提升森林火灾防控能力是维护生态平衡、保护资源和保障人民生命安全的必要步骤。随着无人机技术的发展,其在无人机森林防火中的应用为传统巡查工…

Linux PSI-----Pressure Stall information

PSI——压力阻塞信息 当CPU、memory或IO设备处于竞争状态,业务负载会遭受时延毛刺、吞吐量降低, 及面临OOM的风险。 如果没有一种准确的方法度量系统竞争程度,则有两种后果:一种是用户过于节制, 未充分利用系统资源&…

Mybatis与Spring结合深探——MapperFactoryBean的奥秘

文章目录 前言MapperFactoryBean的工作原理底层实现剖析MapperFactoryBean的checkDaoConfig()方法总结 MapperFactoryBean的getObject()方法 思考联想后续 系列相关相关文章究竟FactoryBean是什么?深入理解Spring的工厂神器超硬核解析Mybatis动态代理原理&#xff0…

lv12 开发板启动过程

1 开发板启动过程 1.1 回顾芯片手册第三章内存映射 对于arm来说,不是给它多大的内存都能读。寻址空间(地址空间)读写范围是有限的,寻址空间的大小与地址总线宽度有关,如32位,地址空间4G(2^32)…

NVMe over Fabrics with SPDK with iRDMA总结 - 3

6.0 Configure and Test NVMe over Fabrics Host(s) to Connect to SPDK Target配置和测试 NVMe over Fabrics 主机以连接 SPDK 目标机 The SPDK NVMe-oF target system is spec compliant, which allows for the use of either an SPDK host or Linux Kernel host to co…

【C语言基础】嵌入式面试经典题(C语言篇)----有新的内容会及时补充、更新!

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

Mac虚拟机CrossOver23破解版下载和许可证下载

CrossOver Mac Mac 和 Windows 系统之间的兼容工具。使 Mac 操作系统的用户可以运行 Windows 系统的应用,从办公软件、实用工具、游戏到设计软件, 您都可以在 Mac 程序和 Windows 程序之间随意切换。 系统要求 运行macOS的基于Intel或Apple Silicon 的…

springboot项目加载配置文件失败

问题 在使用springboot打成jar以后,需要文件加载一个redisson-cluster的配置文件。配置文件是在jar的同级目录。启动时却总是加载jar中的配置文件,而外部配置文件却不加载看下配置:spring:redis:redisson:# redis配置位置file: classpath:red…