FFmpeg 基本数据结构 AVFormatConext 分析

作者:给大佬递杯卡布奇诺日期:2025/10/21

1、FFmpeg 主要数据结构分层设计

1.1 IO抽象层

协议层与 I/O 抽象层 (Protocol & I/O Abstraction),这一层负责从最广泛的数据源读取或写入数据。

  • 核心数据结构:AVIOContext
  • 功能: 抽象了底层的 I/O 操作。通过它,FFmpeg 可以用统一的接口处理文件、网络流(HTTP, RTMP, TCP)、内存缓冲区等。
  • 关键点: 它使得上层的格式层(解复用)无需关心数据是从哪里来的。这对于播放网络直播流或处理内存中的媒体数据至关重要。

1.2 容器层 / 格式层 (Container/Format Layer)

格式层处理多媒体容器(也叫封装格式),如 MP4、MKV、FLV、MP3 等。容器的作用是将不同的媒体流(视频、音频、字幕)打包在一起,并包含元数据。

  • 核心数据结构:AVFormatContext
  • 功能: 代表一个已打开的多媒体文件或流的上下文。它是格式处理的中枢,包含了容器的所有全局信息。
  • 重要成员:
1pb (AVIOContext*): 指向底层的 I/O 上下文。
2streams (AVStream**): 一个数组,包含了容器中所有流的信息。
3nb_streams: 流的数量。
4duration: 容器总时长。
5bit_rate: 容器总比特率。
6metadata: 元数据(如标题、作者)。
7

1.3 编解码层 (Codec Layer)

音视频编码,即压缩和解压缩。例如,将 H.264 码流解码为原始的 YUV 图像,或将 PCM 音频编码为 AAC。

  • 核心数据结构:AVCodecContext
  • 功能: 为一个编解码操作提供完整的上下文。它设置了所有参数,并保持编解码过程的状态。
  • 重要成员:
1codec (AVCodec*): 指向具体的编解码器实现。
2width, height: 视频的宽高。
3pix_fmt: 视频像素格式(如 YUV420P)。
4sample_rate: 音频采样率。
5channel_layout: 音频声道布局。
6sample_fmt: 音频采样格式。
7time_base: 该编解码上下文使用的时间基。
8
  • 核心数据结构:AVCodec
  • 功能: 描述一种编解码器的静态能力,它本身是无状态的。例如 “libx264” 编码器或 “aac” 解码器。
  • 功能: 定义了编解码器的名称、类型、支持的 ID 等。

1.4 数据流转层 (Data Layer)

实际音视频数据的载体,分为压缩数据和原始数据。

  • 核心数据结构:AVPacket
  • 功能: 存储压缩的(已编码的)数据。
  • 来源/去向: 从 AVFormatContext 读取,或向其写入。
  • 重要成员:
1data: 指向压缩数据的指针。
2size: 数据大小。
3pts / dts: 显示时间戳 / 解码时间戳。
4stream_index: 它属于哪个流。
5pos: 在流中的字节位置。
6
  • 核心数据结构:AVFrame
  • 功能: 存储原始的(未压缩的)音频或视频数据。
  • 来源/去向: 传递给解码器得到 AVFrame,或传递给编码器消耗 AVFrame。
  • 重要成员(Video):
1data[]: 指针数组,指向图像平面(如 YUV 数据)。
2linesize[]: 每个图像平面的行字节数。
3width, height: 图像的宽高。
4format: 像素格式(对应 AVPixelFormat)。
5
  • 重要成员(Audio):
1data[]: 指针数组,指向音频数据。
2nb_samples: 每个通道的采样数。
3sample_rate: 采样率。
4format: 采样格式(对应 AVSampleFormat)。
5channel_layout: 声道布局。
6

FFmpeg 对应结构体在各个层级显示如下所示:
在这里插入图片描述

2、AVFormatConext 定义

AVFormatContext 是 FFmpeg 格式(Format)I/O 的抽象核心。你可以把它理解为一个多媒体容器文件的“句柄”或“控制器”。AVFormatContext是一个贯穿全局的数据结构,ffmpeg中对它的注视是 format I/O Context,此结果包含了一个视频流的格式内容,其中有AVInputFormat、AVOutputFormat、但是同一时间AVFormatContext只存在他们其中的一个,AVStream、AVPacket,这几个比较重要的数据结构,以及一些其他的信息,比如titile、author、copyright等,另外还有一些编码用到的信息duration、file_size、bit_size等。
AVFormatContext。

  • 代表了你打开的一个媒体文件(或网络流)。
  • 包含了该媒体文件的全局信息和所有元数据。
  • 持有解复用器(Demuxer)或复用器(Muxer),并通过它们来读写数据。

AVF


FFmpeg 基本数据结构 AVFormatConext 分析》 是转载文章,点击查看原文


相关推荐


SpringCloud微服务项目实战——系统实现篇
thginWalker2025/10/20

06 服务多不易管理如何破——服务注册与发现 经过上一篇系统性的介绍 Spring Cloud 及 Spring Cloud Alibaba 项目,相信你已经对这两个项目有个整体直观的感受,本篇开始正式进入本课程的第二部分,一起进入业务的开发阶段。 服务调用问题 在分析业务需求时,其中有个简单的功能点:会员可以开通月卡,开通月卡的同时,需要增加相应的积分。开通月卡功能在会员服务模块维护,但增加积分功能在积分服务模块维护,这就涉及到两个模块间的服务调用问题。 单实例情况:可以采用点对点的


linux系统jdk&&mysql配置
阑梦清川2025/10/18

使用ubuntu进行举例说明: 更新软件包 sudo apt update 安装JDK sudo apt install openjdk-17-jdk 关于mysql, #查找安装包 apt list |grep "mysql-server" #安装mysql sudo apt install mysql-server 查看数据库的状态: sudo systemctl status mysql 如果遇到问题,参考下面的这个: 这个主要是刷新权限表,然后修改我们的密码,否则会报错


【机器学习入门】8.1 降维的概念和意义:一文读懂降维的概念与意义 —— 从 “维度灾难” 到低维嵌入
做科研的周师兄2025/10/17

对于刚入门机器学习的同学来说,“高维数据” 是很容易遇到的痛点 —— 比如处理包含几十甚至上百个特征的数据集时,不仅训练速度变慢,模型还可能因为 “维度太多” 出现泛化能力下降的问题。而 “降维” 正是解决高维数据困境的核心技术。今天我们就从基础概念出发,拆解 “维度灾难” 的危害、降维的本质,以及经典的低维嵌入方法,帮你彻底理解降维为什么重要、到底在做什么。 一、先搞懂:什么是 “维度”?为什么会有 “维度灾难”? 在学习降维前,我们需要先明确 “维度” 的定义,以及高维数据会带来的核心问


【鸿蒙生态共建】鸿蒙6适配-API变化与兼容(2.UI交互与基础能力篇)--《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
俩毛豆2025/10/15

HarmonyOS开发者版本6.0.0(API 20)Release(鸿蒙6) 在2005年9月25日正式发布。相对于HarmonyOS 5.0版本增加了多项新能力及对已有能力的优化。同时也有部分API进行了变更。 本篇内容是《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》这本书整体内容的延续,是咱这本书读者的福利,内容以本书的示例作为基础,适配鸿蒙6过程中,所需要完成的调整。并将这些调整记录分享给大家,本篇内容主要介绍与UI交互与基础能力的鸿蒙6兼容适配。 打


2025年下半年加密货币市场展望:机遇与挑战并存
终端域名2025/10/14

一、核心机遇:技术融合与市场结构升级 现实世界资产(RWA)代币化加速 市场规模爆发:截至2025年6月,链上RWA总价值已超238亿美元(不含稳定币),涵盖私人信贷、美国国债、大宗商品等领域。贝莱德预测,到2030年RWA市场规模将飙升至16万亿美元,成为DeFi与传统金融融合的关键桥梁。生态主体壮大:发行机构、托管银行、投资者、区块链平台等主体快速聚集,推动资产运营、跨境支付等领域投资机遇。例如,高盛推出RWA平台,某欧洲奢侈品牌通过NFT分割限量版手表所有权,拓宽市场覆盖面。技术支撑


Redis(59)Redis的主从复制是如何实现的?
Victor3562025/10/13

Redis 的主从复制(Master-Slave Replication)是一种数据复制机制,通过它可以将一个 Redis 实例的数据复制到一个或多个从节点。这种机制可以用于数据备份、读写分离、灾难恢复等场景。以下是 Redis 主从复制的详细实现过程及其代码示例。 主从复制原理 主节点(Master):负责处理写操作(SET、DEL 等),并将数据变化同步到从节点。 从节点(Slave):负责处理读操作(GET 等),从主节点接收数据变化。 同步过程: 初次同步:从节点连接到主节点,主节点


全面解析java注解
学到头秃的suhian2025/10/11

一.注解的定义与分类 注解的概念: Java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法 JDK自带注解: @Override  代表子类重写父类的方法 @Deprecated  代表该方法已经过时 @SuppressWarning 代表忽略警告Warnings 注解的分类: 源码注解:注解只在源码中存在,编译成.class文件就不存在了编译时注解:注解在源码和.class文件中都存在(@Override,@Deprecated这些都是)运行时注解


Python 的内建函数
hubenchang05152025/10/9

#Python 的内建函数 此文档创建于 Python 3.13,可能未及时更新,请以 Python 官方文档 为准。 虽然称为内建函数,但部分 API 并不是函数,例如 object 是类。 函数名详情简介__import__查看导入模块abs查看计算绝对值aiter查看获取异步可迭代对象的迭代器all查看判断可迭代对象内容是否全部为真值anext查看获取异步迭代器的下一数据项any查看判断可迭代对象内容是否存在真值ascii查看转换为字符串,非 ASCII 字符将被转义bin查看将一


如何使用 INFINI Gateway 对比 ES 索引数据
极限实验室2025/10/8

上一篇我们通过 极限网关(INFINI Gateway) 进行了索引数据迁移,对索引迁移结果进行了初步且直观的校验,既对比索引的文档数是否一致。今天介绍个实实在在的数据比对方法,通过网关对比索引文档的内容在两个集群是否一致,此方法适用于 Elasticsearch、Easysearch、Opensearch。话不多说,就拿上次迁移的两个索引开整。 测试环境 软件版本Easysearch1.12.0Elasticsearch7.17.29INFINI Ga


从0-1建设数据仓库
DashingGuy2025/10/7

基于onedata,纯个人理解,不完善的会慢慢补充 整体流程 业务调研数据调研划分数据域构建总线矩阵数仓模型设计数仓模型开发数仓模型质量保障以及运维 一、业务调研 业务调研有几个内容要做: 确定目标和范围、收集业务需求、梳理业务流程和数据流向、输出物 1.1 确定目标和范围 明确业务目标:为什么建设数仓?数仓要解决什么问题?要实现哪些业务目标?例如提升数据分析能力、提高经营效率、支持精准营销、预测风险等。 确定数仓范围:数仓要包含哪些业务领域?哪些数据需要纳入数仓?需要支持哪些业务场景?例

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0