当前位置: 首页 > news >正文

FFmpeg常用结构体分析

目录

1.AVFormatConext

2.AVInputFormat

3.AVStream

4.AVCodecContext

5.AVPacket

6.AVCodec

7.AVFrame

8.AVIOContext

9.URLProtocol

10.URLContext


1.AVFormatConext


AVFormatConext是一个贯穿全局地数据结构,AVFormatConext结构包含很多信息,很多函数都要用它作为参数。

初始化AVFormatConext示例代码:

AVFormatContext *pFormatCtx;
pFormatCtx=avformat_alloc_context();

2.AVInputFormat


AVInputFormat是FFmpeg的解复用器对象,AVInputFormat是类似COM接口地数据结构,表示输入文件容器格式,着重于功能类型,一种文件容器格式对应一个AVInputFormat结构,在程序运行时有多个案例。

3.AVStream


AVStream是存储每一个视频/音频流信息的结构体。解复用器的目的就是从容器中分离(解析出来)不同的流,FFmpeg中的流对象为AVStream,它是由解复用器的read_header函数创建的,并保存在AVFormatConext的nb_streams(容器中的流条数)及stream数组中。

4.AVCodecContext


AVCodecContext是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息。

初始化示例代码:

 AVCodecContext *mAvContext = NULL;mAvContext = avcodec_alloc_context3(mVcodec);

5.AVPacket


        FFmpeg 用AVPacket 来存放编码后的视频数据,AVPacket 保存了解复用之后、解码前的数据(仍然是压缩后的数据)和关于这些数据的一些附加信息,如显示时间戳(PTS)解码时间戳(DTS)数据时长、所在媒体流的索引等。
        对于视频(Video)来说,AVPacket 通常包含一个压缩的,而音频 (Audio)则有可能包含多个压缩的帧。并且,一个 Packet 有可能是空的,不包含任何压缩数据,只含有 side dat(side data 指的是容器提供的关于 Packet 的一些附加信息。例如,在编码结束的时候更新一些流的参数)。

申请AVPacket:

    AVPacket *packet = (AVPacket *) av_malloc(sizeof(AVPacket));

AVPacket源码解析:

typedef struct AVPacket {AVBufferRef *buf;//AVBufferRef类型的指针,用来管理data指针引用的数据缓存int64_t pts;//显示时间戳int64_t dts;//解码时间戳uint8_t *data;//指向保存压缩数据的指针,这就是AVPacket实际的数据int   size;int   stream_index;//流索引int   flags;//带有AV_PKT_FLAG属性的组合AVPacketSideData *side_data;//填充容器的一些附加数据int side_data_elems;int64_t duration;//Packet的时长int64_t pos;//Packet的位置                           
#if FF_API_CONVERGENCE_DURATIONattribute_deprecatedint64_t convergence_duration;
#endif
} AVPacket;

6.AVCodec


AVCodec是存储编解码器信息的结构体,AVCodec Codec通过avcodec_find_decoder(codec_id)找到对应的Codec。

初始化AVCodec示例代码:

 AVCodec *mVcodec = NULL;mVcodec = avcodec_find_decoder(codec_id);

7.AVFrame


AVFrame结构体一般用于存储原始数据(即非压缩数据,例如对视频来说是YUV、RGB,对音频来说是PCM),此外还包含了一些相关信息。

创建AVFrame

 AVFrame *frame = av_frame_alloc();//分配一个AVFrame结构体,AVFrame结构体一般用于存储原始数据,指向解码后的原始帧

 在解码过程中使用了两个AVFrame,这两个AVFrame分配缓存空间的方法不同:

  • 一个AVFrame用来存放从AVPacket中解码出来的原始数据,这个AVFrame的数据缓存空间通过调用 avcodec_receive_frame(mAvContext, frame)来分配和填充。
result = avcodec_receive_frame(mAvContext, frame);
  • 另一个AVFrame用来存放将解码出来的原始数据变换为需要的数据格式(例如RGB、RGBA)的数据,这个AVFrame需要手动分配数据缓存空间,代码如下:
  AVFrame *rgb_frame = av_frame_alloc();//分配一个AVFrame结构体,指向存放转换成rgb后的帧//缓存区uint8_t  *out_buffer= (uint8_t *)av_malloc(avpicture_get_size(AV_PIX_FMT_RGBA,mAvContext->width,mAvContext->height));//与缓存区相关联,设置rgb_frame缓存区avpicture_fill((AVPicture *)rgb_frame,out_buffer,AV_PIX_FMT_RGBA,mAvContext->width,mAvContext->height);

 释放AVFrame

 av_frame_free(&frame);av_frame_free(&rgb_frame);

AVFrame源码解析: 

typedef struct AVFrame {
#define AV_NUM_DATA_POINTERS 8uint8_t *data[AV_NUM_DATA_POINTERS];int linesize[AV_NUM_DATA_POINTERS];uint8_t **extended_data;//扩展的数据int width, height;//视频的宽和高int nb_samples;//每个信道的音频采样点个数int format;//帧的像素格式int key_frame;//1表示关键帧 0表示非关键帧enum AVPictureType pict_type;//帧的图像类型AVRational sample_aspect_ratio;//视频帧的采样率int64_t pts;//显示时间戳
#if FF_API_PKT_PTSattribute_deprecatedint64_t pkt_pts;//从AVPacket中复制的PTS
#endifint64_t pkt_dts;//从AVPacket中复制的DTSint coded_picture_number;//按解码排序后的图像数int display_picture_number;//按显示位置排序的图像数int quality;//在1~FF_LAMBDA_MAX(256*128-1)之间取值void *opaque;//私有数据
#if FF_API_ERROR_FRAMEattribute_deprecateduint64_t error[AV_NUM_DATA_POINTERS];
#endifint repeat_pict;//解码时有多少个图像被延迟,extra_delay=repeat_pict/(2*fps)int interlaced_frame;//交错帧,表示图像内容是交错的int top_field_first;int palette_has_changed;int64_t reordered_opaque;int sample_rate;//音频数据的采样率uint64_t channel_layout;//音频信道布局AVBufferRef *buf[AV_NUM_DATA_POINTERS];AVBufferRef **extended_buf;int        nb_extended_buf;AVFrameSideData **side_data;int            nb_side_data;
#define AV_FRAME_FLAG_CORRUPT       (1 << 0)
#define AV_FRAME_FLAG_DISCARD   (1 << 2)int flags;enum AVColorRange color_range;enum AVColorPrimaries color_primaries;enum AVColorTransferCharacteristic color_trc;enum AVColorSpace colorspace;//YUV颜色空间类型enum AVChromaLocation chroma_location;int64_t best_effort_timestamp;int64_t pkt_pos;//记录上一包输出解码器时Packet的位置int64_t pkt_duration;//Packet的时长AVDictionary *metadata;int decode_error_flags;int channels;//音频信道个数int pkt_size;//Packet的大小
#if FF_API_FRAME_QPattribute_deprecatedint8_t *qscale_table;attribute_deprecatedint qstride;attribute_deprecatedint qscale_type;attribute_deprecatedAVBufferRef *qp_table_buf;
#endifAVBufferRef *hw_frames_ctx;AVBufferRef *opaque_ref;size_t crop_top;size_t crop_bottom;size_t crop_left;size_t crop_right;AVBufferRef *private_ref;
} AVFrame;

8.AVIOContext


协议(文件)操作的顶层结构式AVIOContext,这个对象实现了带缓冲的读/写操作。FFmpeg的输入对象AVFormat的pb字段指向一个AVIOContext。

典型应用如下:

AVFormatContext *ic=NULL;
ic=avformat_alloc_context();
unsigned char *iobuffer=(unsigned char*)av_malloc(32768);
AVIOContext *avio=avio_alloc_context(iobuffer,32768,0,buffer,fill_iobuffer,NULL,NULL);
ic->pb=avio;
err=avformat_open_input(&ic,is->filename,is->iformat,&format_opts);

9.URLProtocol


URLProtocol是FFmpeg操作文件的结构(包括文件、网络数据流等),包括open、close、read、write、seek等操作。URLProtocol为协议操作对象,针对每种协议会有一个这样的对象,每个协议操作对象和一个协议对象关联。

10.URLContext


URLContext对象封装了协议对象及协议操作对象,URLContext在avio.c中通过url_alloc_for_protocol进行初始化。并且分配空间(使用av_malloc(sizeof(URLContext)+strlen(filename)+1)函数)。


参考:Android 音视频开发(何俊林 著)

相关文章:

FFmpeg常用结构体分析

目录 1.AVFormatConext 2.AVInputFormat 3.AVStream 4.AVCodecContext 5.AVPacket 6.AVCodec 7.AVFrame 8.AVIOContext 9.URLProtocol 10.URLContext 1.AVFormatConext AVFormatConext是一个贯穿全局地数据结构&#xff0c;AVFormatConext结构包含很多信息&#xff0c…...

ChatGPT 学习笔记 | 什么是 Prompt-tuning?

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 Prompt-tuning is an efficient, low-cost way of adapting an AI foundation model to new downstream tasks without retraining the model and upd…...

[红明谷CTF 2021]write_shell %09绕过过滤空格 ``执行

目录 1.正常短标签 2.短标签配合内联执行 看看代码 <?php error_reporting(0); highlight_file(__FILE__); function check($input){if(preg_match("/| |_|php|;|~|\\^|\\|eval|{|}/i",$input)){ 过滤了 木马类型的东西// if(preg_match("/| |_||php/&quo…...

JVM学习笔记

JVM学习笔记 复习之前学的内容&#xff0c;同时补充以下知识点&#xff1a;JVM的双亲委派机制、伊甸区与老年代相关知识&#xff1b; 双亲委派机制 首先介绍Java中的类加载器 Java中的类加载器 Bootstrap ClassLoader&#xff08;启动类加载器&#xff09;&#xff0c;默认…...

使用 gst-element-maker 创建一个完全透传的 videofilter 插件

系列文章目录 创建 gstreamer 插件的几种方式 使用 gst-template 创建自己的 gstreamer 插件 使用 gst-plugins-bad 里面的 gst-element-maker 工具创建gstreamer 插件 使用 gst-element-maker 创建一个完全透传的 videofilter 插件 文章目录 系列文章目录前言一、使用gst-ele…...

华为ensp单臂路由及OSPF实验

单臂路由及OSPF实验 1.1实验背景 在这个实验中&#xff0c;我们模拟了一个复杂的网络环境&#xff0c;该网络环境包括多个子网和交换机。这个实验旨在帮助网络工程师和管理员了解如何配置单臂路由和使用开放最短路径优先&#xff08;OSPF&#xff09;协议来实现不同子网之间的…...

Android LiveData 介绍

Android LiveData 介绍 系列文章目录前言一、LiveData是什么&#xff1f;二、简单使用依赖测试数据准备1.创建可观察的livedata2.观察它3.更新它 总结 系列文章目录 Android LiveData 介绍&#xff08;本文&#xff09; 前言 本系列根据官网介绍Jetpack中的数据通信组件&…...

好看的货架效果(含3D效果)

搭配thymeleaf layui合成 货架一 1. css #gudinghuojia2F .layui-row { display: flex; justify-content: space-between; height: 100%;} #gudinghuojia2F .layui-col-xs10 {margin-right: 4%;} #gudinghuojia2F .layui-col-xs10:last-child {margin-right: 0;} .inner-ti…...

【每日一题】1498. 满足条件的子序列数目

1498. 满足条件的子序列数目 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums 和一个整数 target 。 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。 由于答案可能很大&#xff0c;请将结果对 109 7 取余后…...

Go语言数据类型实例讲解 - Go语言从入门到实战

Go语言数据类型实例讲解 - Go语言从入门到实战 基础数据类型 bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte rune float32 float64 complex64 complex128类型描述bool布尔型&#xff08;bool&#xff09;&#xff1a;可以是true或f…...

RocketMQ 事务消息发送

目录 事务消息介绍 应用场景 功能原理 使用限制 使用示例 使用建议​ 事务消息介绍 在一些对数据一致性有强需求的场景&#xff0c;可以用 RocketMQ 事务消息来解决&#xff0c;从而保证上下游数据的一致性。 应用场景 分布式事务的诉求 分布式系统调用的特点为一个核…...

后端-POST请求中只需要两个参数,后端不想创建对象时

问题&#xff1a; 在前后端对接中&#xff0c;很多前端的规范是POST&#xff0c;参数放body里面&#xff0c;媒体类型是json&#xff0c;后端就需要用RequestBody去接收&#xff0c;但是后端只用接收两个对象&#xff0c;这时候后端不想创建对象&#xff0c;使用RequestParm&a…...

UG\NX二次开发 通过点云生成曲面 UF_MODL_create_surf_from_cloud

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 Rlgun 订阅本专栏,非常感谢。 简介 有网友想做一个通过点云生成曲面的程序,我们也试一下 效果 代码 #include "me.hpp" /*HEAD CREATE_SURF_FROM_CLOUD CCC UFUN */...

Linux常用指令(二)

目录 一、 删除空目录&#xff08;rmdir&#xff09; 二、ln 硬链接与软链接 三、新建空文件或更新文件的时间戳&#xff08;touch&#xff09; 四、比较文件内容的差异&#xff08;diff&#xff09; 五、显示当前时间或设置系统时间&#xff08;date&#xff09; 六、显…...

【HUAWEI】单臂路由

目录 ​ &#x1f96e;写在前面 &#x1f96e;2.1、拓扑图 &#x1f96e;2.2、操作思路 &#x1f96e;2.3、配置操作 &#x1f363;2.3.1、LSW4配置 &#x1f363;2.3.2、R2配置 &#x1f363;2.3.3、测试网络 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &…...

安全学习_开发相关_Java第三方组件Log4jFastJSON及相关安全问题简介

文章目录 JNDI&#xff1a;(见图) Java-三方组件-Log4J&JNDILog4J&#xff1a;Log4j-组件安全复现使用Log4j Java-三方组件-FastJsonFastJson&#xff1a;Fastjson-组件安全复现对象转Json(带类型)Json转对象Fastjson漏洞复现&#xff08;大佬文章 JNDI&#xff1a;(见图) …...

零代码编程:用ChatGPT批量自动下载archive.org上的音频书

http://archive.org 是一个神奇的网站&#xff0c;可以下载各种古旧的软件、书籍、音频、视频&#xff0c;还可以搜索各个网站的历史网页。 比如说&#xff0c;一些儿童故事音频就可以在http://archive.org下载到&#xff0c;可以用来做英语听力启蒙用。 举个例子&#xff0c…...

力扣用队列实现栈

自己写的栈&#xff0c;再让其他函数去调用自己写的栈 typedef int QDataType; typedef struct QueueNode {struct QueueNode* next;//单链表QDataType data;//放数据 }QNode;typedef struct Queue {QNode* phead;//头节点QNode* ptail;//尾节点QDataType size; //统计有多少节…...

一朵华为云,如何做好百模千态?

点击关注 文丨刘雨琦、郝鑫 2005年华为提出网络时代的“All IP”&#xff0c;2011年提出数字化时代的“All Cloud”&#xff0c;2023年提出智能时代的“All Intelligence”。 截至目前&#xff0c;华为的战略升级经历了三个阶段。 步入智能化&#xff0c;需要迎接的困难依然…...

华为云云耀云服务器L实例评测 | 实例使用教学之软件安装:华为云云耀云服务器环境下安装 Docker

华为云云耀云服务器L实例评测 &#xff5c; 实例使用教学之软件安装&#xff1a;华为云云耀云服务器环境下安装 Docker 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云云耀云…...

小程序编译器性能优化之路

作者 | 马可 导读 小程序编译器是百度开发者工具中的编译构建模块&#xff0c;用来将小程序代码转换成运行时代码。旧版编译器由于业务发展&#xff0c;存在编译慢、内存占用高的问题&#xff0c;我们对编译器做了一次大规模的重构&#xff0c;采用自研架构&#xff0c;做了多线…...

FFmpeg 命令:从入门到精通 | ffmpeg 命令分类查询

FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令分类查询 FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令分类查询ffmpeg -versionffmpeg -buildconfffmpeg -formatsffmpeg -muxersffmpeg -demuxersffmpeg -codecsffmpeg -decodersffmpeg -encodersffmpeg -bsfsffmpeg…...

Linux学习记录——삼십일 socket编程---TCP套接字

文章目录 TCP套接字简单通信1、服务端1、基本框架2、获取连接 2、客户端3、多进程4、多线程5、线程池6、简单的日志系统7、守护进程8、其它 TCP套接字简单通信 本篇gitee 学习完udp套接字通信后&#xff0c;再来看TCP套接字。 四个文件tcp_server.hpp&#xff0c; tcp_serve…...

【学习笔记】深度学习分布式系统

深度学习分布式系统 前言1. 数据并行&#xff1a;参数服务器2. 流水线并行&#xff1a;GPipe3. 张量并行&#xff1a;Megatron LM4. 切片并行&#xff1a;ZeRO5. 异步分布式&#xff1a;PATHWAYS总结参考链接 前言 最近跟着李沐老师的视频学习了深度学习分布式系统的发展。这里…...

【数据结构】树、二叉树的概念和二叉树的顺序结构及实现

目录 前言&#xff1a;一、树的概念及结构1.树的概念2.树的相关概念3.树的存储4.树在实际中的运用 二、二叉树概念及结构1.概念2.特殊的二叉树&#xff08;1&#xff09;满二叉树&#xff08;2&#xff09;完全二叉树 3.二叉树的性质4.二叉树的存储(1)顺序存储(2)链式存储 三、…...

rust学习-string

介绍 A UTF-8–encoded, growable string(可增长字符串). 拥有string内容的所有权 A String is made up of three components: a pointer to some bytes, a length, and a capacity. The length is the number of bytes currently stored in the buffer pub fn as_bytes(&…...

No167.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...

【python】pycharm导入anaconda环境

参考 Pycharm导入anaconda环境的教程图解 - 知乎 (zhihu.com)...

【数据结构】逻辑结构与物理结构

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f333;逻辑结构 1.集合结构 2.线性结构 3.树形结构 4.图形结构或网状结构 &#x1f333;物理结构 1.顺序存储结构 2.链式存储结构 结语 根据视点的不同,我…...

HTML5高级部分

目录 一、拖拽API1.1 拖拽元素1.2 监听事件1.3 dataTransfer传递数据 二、媒体API2.1 常用监听事件2.2 常用API 三、画布API3.1 canvas 标签3.2 创建canvas对象3.3 常用API 四、地理API4.1 方法 一、拖拽API 1.1 拖拽元素 页面中设置了draggable"true"的元素可以进…...

网页托管网站/百度一下官方网

交通运输业是否属于现代服务业交通运输业是指使用运输工具将货物或者旅客送达目的地,走其空同位置得到转移的业务活动.包括陆路运输服务、水路运输服务、航空运输服务和管道运输服务.属于服务业,服务业视同为第三产业.交通运输、仓储和邮政业信息传输、计算机服务和软件业批发和…...

做废钢推广网站/知名品牌营销策划案例

问题描述 taro 相关的包升级版本&#xff0c;升级之后&#xff0c;报错提示&#xff1a; 解决方案 打开 package.json 检查一下是否所有tarojs/xxx的库&#xff08;不包括 tarojs/plugin-xxx&#xff09;都是同一个版本&#xff0c;如果有不同的版本就统一成同一个版本&…...

重庆 机械有限公司 沙坪坝网站建设/百度信息流广告位置

宽为限 紧用功 工夫到 滞塞通 使用mybatis框架时遇到的一个错误&#xff0c;记录一下 org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: jav…...

万维网的代表网站/营销软文小短文

如果需要查看一段时间内的结果、对比不同数据集的结果,或展示单个元素对汇总量的贡献和影响,则条形图会很有用处。 默认情况下,条形图会将一个向量或矩阵中的每个元素表现为一个条形,条形的高度与元素的值成比例。 二维条形图 bar 函数沿着 x 轴分布条形。同一行的矩阵元素…...

泸州建设网站/清理大师

1. dataType错误 我遇到的就是这个dataType错误&#xff0c;即后台返回的dataType类型与前台写的不一致&#xff0c;一般前台写json没问题&#xff0c;大部分是后台返回的类型对不上 2. async请求同步异步问题 这个没有遇见过很少碰到类似的问题 async默认是true(异步请求),如果…...

合肥网站建设制作价格/端口扫描站长工具

进程创建 fork vfork 进程等待 wait方法 waitpid方法 获取子进程status wait方式获取子进程status waitpid方式获取status 进程等待 waitpid进程的阻塞方式等待 waitpid进程的非阻塞等待方式 进程替换 Shell进程替换 Shell进程替换的本质 进程替换原理 实现一个minishell 进程创…...