《FFmpeg 核心结构体详解:从 AVFormatContext 到 AVFrame》

张开发
2026/5/30 8:35:44 15 分钟阅读
《FFmpeg 核心结构体详解:从 AVFormatContext 到 AVFrame》
FFmpeg 核心结构体详解前言1. 概述2. 核心结构体详解2.1 AVFormatContext容器上下文2.2 AVStream流2.3 AVCodec编解码器2.4 AVCodecContext编解码器上下文2.5 AVCodecParameters编码参数2.6 AVPacket压缩数据包2.7 AVFrame原始数据帧2.8 SwsContext / SwrContext转换上下文3. 常见结构体总结表4. 关键 API 调用顺序4.1 封装流程4.2 编码流程4.3 解码流程4.4 解封装流程5. .常见的流程图及各结构体在流程中的位置5.1 读取音视频文件播放器/解封装解码5.2 写入音视频文件转码器/编码封装5.3 完整转码流程解码 -- 编码5.4 核心数据结构流转关系5.6 各结构体在流程中的位置结语前言在学习FFmpeg的过程中每次写代码的时候会遇到很多奇奇怪怪的结构体变量有的人喜欢叫上下文有的人喜欢说是实例之类等等很多人却只管声明和调用这些结构体变量却不是很清楚这些结构体到底在整个代码中有什么作用又充当着什么角色接下来我就来总结一下ffmpeg音视频代码编写中常用的一些结构体。1. 概述FFmpeg 是模块化设计每个结构体负责一个环节类比工厂流水线便于理解2. 核心结构体详解2.1 AVFormatContext容器上下文职责管理封装/解封装关键字段nb_streams、streams、duration、bit_rate生命周期avformat_alloc_context显式分配常见情况下不需要这一步而是声明实例后直接通过下一步函数隐式分配 → avformat_open_input → avformat_close_input2.2 AVStream流职责描述一个视频/音频流关键字段index、codecpar、time_base、duration注意多个流对应多个 AVStream2.3 AVCodec编解码器职责编解码算法的描述关键字段name、long_name、id获取方式avcodec_find_encoder / avcodec_find_decoder2.4 AVCodecContext编解码器上下文职责编解码器的工作实例关键字段width、height、pix_fmt、bit_rate、time_base生命周期avcodec_alloc_context3 → avcodec_open2 → avcodec_free_context2.5 AVCodecParameters编码参数职责存储流的编码参数从 AVStream 获取作用从解封装传递到解码器2.6 AVPacket压缩数据包职责存储编码后的数据H.264 帧、AAC 帧等关键字段data、size、pts(显示时间戳)、dts(解码时间戳)、stream_index生命周期av_packet_alloc → av_read_frame → av_packet_unref2.7 AVFrame原始数据帧职责存储解码后的数据YUV、PCM 等关键字段data、linesize、pts、width、height、format生命周期av_frame_alloc → avcodec_receive_frame → av_frame_free2.8 SwsContext / SwrContext转换上下文职责图像缩放/格式转换、音频重采样使用场景YUV→RGB、48kHz→44.1kHz3. 常见结构体总结表实例类型变量名示例职责比喻AVFormatContextfmt_ctx容器上下文管理文件格式MP4/AVI负责解封装/封装文件包装工AVStreamstream流信息描述一个视频流或音频流的元数据单条流水线AVCodeccodec编解码器具体的编码/解码算法如 H.264算法工人AVCodecContextcodec_ctx编解码器上下文编解码器的实例带着参数工作工人的工作台AVCodecParameterscodecpar编码参数存储流的编码参数分辨率、采样率等产品规格书AVPacketpkt压缩数据包编码后的数据待解码或已编码压缩货物AVFrameframe原始数据帧解码后的数据YUV/PCM 等原始货物SwsContextsws_ctx图像转换上下文缩放、格式转换YUV→RGB图像转换工SwrContextswr_ctx音频重采样上下文采样率/声道转换音频转换工4. 关键 API 调用顺序4.1 封装流程4.2 编码流程4.3 解码流程4.4 解封装流程5. .常见的流程图及各结构体在流程中的位置5.1 读取音视频文件播放器/解封装解码5.2 写入音视频文件转码器/编码封装5.3 完整转码流程解码 -- 编码5.4 核心数据结构流转关系5.6 各结构体在流程中的位置阶段结构体职责解封装AVFormatContext打开文件管理容器格式AVStream存储流的元数据编码类型、时长等AVPacket读取压缩数据包解码AVCodecContext解码器工作环境AVCodec具体的解码算法AVFrame存放解码后的原始数据编码AVCodecContext编码器工作环境AVCodec具体的编码算法AVPacket存放编码后的压缩数据封装AVFormatContext管理输出容器格式AVStream创建输出流AVPacket写入压缩数据包结语理解这些结构体是掌握 FFmpeg 开发的第一步。只有弄清楚每个结构体在数据流中的位置和作用才能真正写出稳定、高效的音视频处理代码。希望本文能帮助你建立起 FFmpeg 的知识框架。如有问题欢迎留言讨论。

更多文章