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

《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_input

2.2 AVStream(流)

  • 职责:描述一个视频/音频流
  • 关键字段:index、codecpar、time_base、duration
  • 注意:多个流对应多个 AVStream

2.3 AVCodec(编解码器)

  • 职责:编解码算法的描述
  • 关键字段:name、long_name、id
  • 获取方式:avcodec_find_encoder / avcodec_find_decoder

2.4 AVCodecContext(编解码器上下文)

  • 职责:编解码器的工作实例
  • 关键字段:width、height、pix_fmt、bit_rate、time_base
  • 生命周期:avcodec_alloc_context3 → avcodec_open2 → avcodec_free_context

2.5 AVCodecParameters(编码参数)

  • 职责:存储流的编码参数(从 AVStream 获取)
  • 作用:从解封装传递到解码器

2.6 AVPacket(压缩数据包)

  • 职责:存储编码后的数据(H.264 帧、AAC 帧等)
  • 关键字段:data、size、pts(显示时间戳)、dts(解码时间戳)、stream_index
  • 生命周期:av_packet_alloc → av_read_frame → av_packet_unref

2.7 AVFrame(原始数据帧)

  • 职责:存储解码后的数据(YUV、PCM 等)
  • 关键字段:data、linesize、pts、width、height、format
  • 生命周期:av_frame_alloc → avcodec_receive_frame → av_frame_free

2.8 SwsContext / SwrContext(转换上下文)

  • 职责:图像缩放/格式转换、音频重采样
  • 使用场景:YUV→RGB、48kHz→44.1kHz

3. 常见结构体总结表

实例类型变量名示例职责比喻
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 的知识框架。如有问题欢迎留言讨论。

http://www.jsqmd.com/news/618566/

相关文章:

  • 2026年手术床选购指南:三招教你省钱挑对高性价比产品 - 精选优质企业推荐榜
  • 忍者像素绘卷基础教程:云端画布背景CSS定制+像素格底纹参数调整
  • 代码之外周刊(第期):当技术让一切趋同,我们还剩什么?稼
  • SpringBoot3实战:JetCache多级缓存架构设计与性能优化
  • 2026年护理床选购指南:教你3招挑对高性价比病床 - 精选优质企业推荐榜
  • 突破视觉盲区:多模态超视感知如何破解具身智能核心痛点
  • Claude Code 常用命令大全
  • 2026届最火的十大AI辅助论文平台解析与推荐
  • Youtu-Parsing开发环境配置:IntelliJ IDEA远程调试与Docker集成
  • 2026年阿里企业邮箱服务商推荐:价格、功能与选购全解析 - 品牌2025
  • 【人工智能】RAGFlow知识库嵌入模型选型:BGE系列 深度对比与实战指南
  • 从零构建MOT数据集:DarkLabel的YAML配置艺术与实战技巧
  • 玫莉蔻净透清肌按摩啫喱|深层细胞清洁,让肌肤畅快呼吸 - 博客万
  • 超六成营销高管预计 AI 将高度颠覆消费者行为
  • 零基础玩转OpenClaw:用Kimi-VL-A3B-Thinking制作个人AI助手
  • 国产替代进行时:内腐蚀试验机厂家竞争力白皮书 - 品牌推荐大师1
  • 2026年企业微信上门服务:功能体系与行业应用解析 - 品牌2025
  • gemma-3-12b-it环境部署教程:Ollama下896×896图像编码与文本生成
  • 避坑指南:发SCI前必看!第一作者和通讯作者署名里的那些“雷”
  • 我用 AI 辅助开发了一系列小工具():文件提取工具啡
  • 硬件小程序开发公司怎么选?北京定制化解决方案优选(附带联系方式) - 品牌2025
  • CogVideoX-2b效率提升:单卡多任务排队生成可行性分析
  • 【AI原生安全治理黄金法则】:2026奇点大会首发的7大可落地框架与3类高危漏洞拦截清单
  • 2026高标准厂房环保工程找谁做?宏创巨建设承包商更专业 - 品牌2026
  • 2026最权威的十大降AI率神器横评
  • 终极网盘直链下载助手完整教程:如何轻松获取八大平台真实下载地址
  • 差分放大电路与LC谐振:从理论到实践的频率偏差分析
  • ESP居然能当 DNS 服务器用?内含NCSI欺骗和DNS劫持实现究
  • AIM-D系列直流IT系统绝缘监测产品:筑牢直流电气安全第一道防线
  • [tailwindcss | 暗黑不生效]