[ffmpeg] AVFrame 功能整理

news/2024/7/10 19:18:41 标签: ffmpeg, AVFrame

背景

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

AVFrame__3">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__24">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.niftyadmin.cn/n/5251384.html

相关文章

Mybatis、Mybatis整合Spring的流程图

Mybatis 注意MapperProxy里面有invoke方法,当进到invoker方法会拿到 二、mybatis整合Spring 1、当我们的拿到的【Dao】其实就是【MapperProxy】,执行Dao的方法时,会被MapperProxy的【Invoke方法拦截】 2、图上已经标注了MapperProxy包含哪些…

时间序列预测 — BiLSTM实现多变量多步光伏预测(Tensorflow)

目录 1 数据处理 1.1 导入库文件 1.2 导入数据集 1.3 缺失值分析 2 构造训练数据 3 模型训练 3.1 BiLSTM网络 3.2 模型训练 4 模型预测 1 数据处理 1.1 导入库文件 import time import datetime import pandas as pd import numpy as np import matplotlib.pyplot…

基于以太坊的智能合约开发Solidity(函数继承篇)

参考教程:【实战篇】1、函数重载_哔哩哔哩_bilibili 1、函数重载: pragma solidity ^0.5.17;contract overLoadTest {//不带参数function test() public{}//带一个参数function test(address account) public{}//参数类型不同,虽然uint160可…

【Amis Low Code 结合FastAPI进行前端框架开发】

官方文档 封装思想 直接复制官网json数据即可开发每个json中的接口由fastapi 转发(透传)使其开发模式与前端思维一致 基础组件 from amis import Page, Service, App from pydantic import BaseModel, Field from fastapi import FastAPI, Request, …

MybatisPlus集成baomidou-dynamic,多数据源配置使用、MybatisPlus分页分组等操作示例

文章目录 MybatisPlus特性MybatisPlus支持数据库MybatisPlus 架构多数据源应用场景pom配置示例代码 MybatisPlus特性 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本 CURD&#…

代客泊车手势召车功能设计规范

目 录 Contents 目录 1. 介绍 Introduction. 8 1.1 此文档的范围和目的 Scope and Purpose of This Document 8 1.2 参考文档References. 9 1.3 文档的维护 Maintenance of the Document 10 1.4 缩略词Abbreviations. 10 1.5 文档概述Document Overview.. 11 1.6 功能…

Flutter自定义下拉选择框dropDownMenu

利用PopupMenuButton和PopupMenuItem写了个下拉选择框,之所以不采用系统的,是因为自定义的更能适配项目需求,话不多说,直接看效果 下面直接贴出代码、代码中注释写的都很清楚,使用起来应该很方便,如果有任何…

wordpress小记

1.插件市场搜索redis,并按照 Redis Object cache插件 2.开启php的redis扩展 执行php -m|grep redis,没有显示就执行 yum -y install php-redis3.再次修改wp配置文件,增加redis的配置 define( WP_REDIS_HOST, 114.80.36.124 );define( WP_…