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

FFmpeg 基本数据结构 AVFormatConext 分析

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

1.3 编解码层 (Codec Layer)

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

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

1.4 数据流转层 (Data Layer)

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

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

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
http://www.dtcms.com/a/506644.html

相关文章:

  • 使用 DrissionPage——实现同花顺股票数据自动化爬虫
  • 基于位置式PID算法调节PWM占空比实现电机转速控制
  • FFmpeg+QT输出音频
  • 友点企业网站管理系统微信商城在哪里找
  • 深度学习(5)-PyTorch 张量详细介绍
  • 西安市建设厅网站软文营销的经典案例
  • Agent 开发设计模式(Agentic Design Patterns )第8章: 智能体记忆管理(Memory Management)
  • Linux 下使用 Docker-Compose 安装 Kafka 和 Kafka-UI(KRaft 模式)
  • 【C++入门篇 - 10】:模板
  • [Linux]学习笔记系列 -- [kernel][lock]mutex
  • 开源 Linux 服务器与中间件(七)数据库--MySQL
  • 在 JavaScript 中处理 `0.1 + 0.2` 这类精度问题
  • 今天我们学习python编程常用模块与面向对象
  • 网站的三大标签宁波专业seo服务
  • Day6C语言前期阶段练习之汉诺塔问题
  • Apache Spark 集群部署与使用指南
  • 基于3D LiDAR的作物排检,用于在不同种植密度下成熟时的大豆
  • Python使用Medical Information Dataset实战2025.07版(上)
  • 基因组学中的深度学习!
  • 基于容器适配器模式的 Stack 与 Queue 实现:复用底层容器的优雅设计
  • Kafka面试精讲 Day 26:Kafka集群部署与配置
  • 73_基于深度学习的水面漂浮垃圾检测系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • 在JavaScript中,清除 Canvas 画布上的内容
  • 方便做简笔画的网站或软件公司人员管理系统
  • SQL之参数类型讲解
  • CTFSHOW—WEB5
  • UU远程深度测评:重构远程控制体验的“无套路”标杆
  • 提升 iOS 26 系统流畅度的实战指南,多工具组合监控
  • vue3:vue3 + elementplus + pinia实现js的XMLHttpRequest 下载功能。
  • 如何在macOS上免密登录阿里云ECS服务器