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

FFmpeg 基本数据结构 AVStream分析

1、AVStream 定义

AVStream 是 FFmpeg 中表示单个媒体流(视频、音频、字幕等)的核心数据结构,负责存储流的元数据、时间信息和编解码参数。AVStream 是 FFmpeg 中用于表示媒体文件(容器)中一个独立媒体流的抽象。 一个媒体文件(如 MP4、MKV)通常包含多个流:

  • 一个视频流(Video Stream)
  • 一个或多个音频流(Audio Stream,如不同语言)
  • 可能还有字幕流(Subtitle Stream)、数据流等
    AVStream 就是描述这其中每一个流的信息的载体。它不包含具体的压缩数据(那是 AVPacket 的职责),而是包含流的元数据(Metadata)和配置信息。
    在这里插入图片描述

2、AVStream 具体成员分析

AVStream核心作用:

  1. 流标识:通过 index 和 id 唯一标识媒体流
  2. 参数存储:通过 codecpar 保存编解码参数
  3. 时间管理:通过 time_base 和 duration 维护时间体系
  4. 元数据承载:存储语言、标题等描述信息
  5. 帧率控制:提供真实帧率和平均帧率数据
  6. 事件响应(FFmpeg 7+):支持动态参数变更通知

具体定义如下:

typedef struct AVStream {const AVClass *av_class; // 指向一个表示AVStream结构的AVClass结构的指针int index; // 流索引int id; // 流IDAVCodecParameters *codecpar; // 指向一个AVCodecParameters结构的指针,用于存储编解码器参数void *priv_data; // 指向私有数据的指针AVRational time_base; // 时间基准int64_t start_time; // 开始时间int64_t duration; // 持续时间int64_t nb_frames; // 帧数int disposition; //  dispositionenum AVDiscard discard; // 丢弃策略AVRational sample_aspect_ratio; // 采样比例AVDictionary *metadata; // 元数据AVRational avg_frame_rate; // 平均帧率AVPacket attached_pic; // 附加图片attribute_deprecatedAVPacketSideData *side_data; // 指向AVPacketSideData结构的指针,用于存储侧数据attribute_deprecatedint nb_side_data; // 侧数据数量int event_flags; // 事件标志AVRational r_frame_rate; // 原始帧率int pts_wrap_bits; // PTS包装位
} AVStream;各个成员的含义如下:
- av_class: 一个指向AVClass结构的指针,用于表示AVStream的属性。
- index: 一个整数,用于表示流索引。
- id: 一个整数,用于表示流ID。
- codecpar: 一个指向AVCodecParameters结构的指针,用于存储编解码器参数。
- priv_data: 一个指向私有数据的指针。
- time_base: 一个AVRational结构体,用于表示时间基准。
- start_time: 一个int64_t类型的整数,用于表示开始时间。
- duration: 一个int64_t类型的整数,用于表示持续时间。
- nb_frames: 一个int64_t类型的整数,用于表示帧数。
- disposition: 一个整数,用于表示 disposition。
- discard: 一个枚举类型,用于表示丢弃策略。
- sample_aspect_ratio: 一个AVRational结构体,用于表示采样比例。
- metadata: 一个指向AVDictionary结构的指针,用于表示元数据。
- avg_frame_rate: 一个AVRational结构体,用于表示平均帧率。
- attached_pic: 一个AVPacket结构体,用于表示附加图片。
- side_data: 一个指向AVPacketSideData结构的指针,用于存储侧数据(已弃用)。
- nb_side_data: 一个整数,用于表示侧数据数量(已弃用)。
- event_flags: 一个整数,用于表示事件标志。
- r_frame_rate: 一个AVRational结构体,用于表示原始帧率。
- pts_wrap_bits: 一个整数,用于表示PTS包装位。

解复用的目的就是从容器中分离出来不同的流,ffmpeg中AVStream,它是由解复用器的read_header函数创建的,并保存在AVFormatContext的nb_streams(容器中的流条数)以及stream数组中。
[图片]

3、AVStream 创建分析

以ff_srt_demuxer为例,它的read_header指向srt_read_heade函数,该函数主要完成以下功能。

  • (1) 调用avformat_new_stream函数创建一条流。
    • 调整AVFormatContext->streams的大小。
    • 申请流空间并清零。
    • 申请AVStream->info空间并清零。
    • 申请AVStream->codec(AVCodecContext对象)空间并设置默认值(avcodec_get_context_default3函数设置)。
    • 设置流的其余参数默认值。
    • 将流的指针放入AVFormatContext->streams数组的末尾。
  • (2)设置AVStream->codec->codec_type及AVStream->codec->codec_id分别为AVMEDIA_TYPE_SYBTITLE、AV_CODEC_ID_SUBRIP。
  • (3)循环读入每条字幕(ff_subtitles_read_chunk函数),并从中解析出字幕细腻些(PTS、duration以及字幕内容),然后调用ff_subtitiles_queue_insert函数将字幕内容插入队列并返回AVPacket指针(以便插入从字幕中解析出私有数据)。
  • (4)读入完成后,调用ff_subtitiles_queue_finalize函数对队列中的数据进行排序,并调整字幕持续时间。
http://www.dtcms.com/a/532395.html

相关文章:

  • kafka数据同步一致性问题
  • 淘宝网站的建设内容网站建设的平台
  • Linux进程间通信:管道与System V IPC的全解析
  • 技术选型对比:几种主流方案获取淘宝商品实时数据的优劣分析
  • 想象力网站建设深圳市房地产信息系统平台
  • 让 Codex 用 React 生成一个博客首页
  • Kafka的概念
  • 开发实战 - ego商城 - 补充:小程序性能优化
  • 如何截取PDF内容为图片
  • 智慧景区导览小程序
  • 58同城企业网站怎么做的wordpress 评论设计
  • 珠海建站模板怎么做多语言网站
  • 致敬哈耶克,让灯火照亮个人前行的道路
  • 【LeetCode100】--- 96.只出现一次的数字【思维导图+复习回顾】
  • 网络编程Socket套接字
  • 算法基础篇(9)倍增与离散化
  • 搓了一个Deepin15的兼容环境(也支持Deepin20/23)
  • C++ - C++11拓展
  • php 装修网站柳州搜索引擎营销平台
  • Householder变换:线性代数中的镜像反射器
  • 【AI智能体】Coze 打造励志图文智能体应用实战操作详解
  • 网站添加友情链接网络推广营销工具
  • 做网站怎么添加关键词网站开发公司报价单模板
  • 山西太原做企业网站建设的公司松原建设局网站
  • HTTP的get请求和post请求的联系和区别
  • 004-Spring AI Alibaba Chat Memory 功能完整案例
  • 用模板网站做h5宣传页多少钱鄂尔多斯seo
  • 人工智能数学
  • Jenkins 从0基础到有点基础——如何安装
  • 我在高职教STM32(新06)——蜂鸣器鸣响实验