ffmpeg源码分析(七)结构体之AVStream

AVStream是存储每一个视频/音频/字幕/其它流信息的结构体。

头文件

github.com

关键字段

  1. index: 流下标,AVFormatContext中对应流的索引

  2. id: 流id,解码时由libavformat设置,编码时由用户设置。

  3. type: 编解码器的类型,可以是音频、视频等。

  4. id: 编解码器类型的唯一标识符,属于 AVCodecID 类型。

  5. codecpar : 这是一个包含编解码器参数的结构体。它包括了与该流关联的编解码器的配置,如编码类型、码率、帧率等。解复用时再avformat_find_stream_info()中获取,复用时由调用者在avformat_write_header()中配置。

  6. time_base: 表示时间基准,用于将时间戳转换为实际时间。例如,如果 time_base{1, 25},即1s用25来标识,则时间戳为 50 的帧表示 2 秒。

  7. sample_aspect_ratio 宽高比

  8. metadata: 一个字典,包含与该流关联的元数据。这些元数据可能包括标题、艺术家、年份等信息。

  9. avg_frame_rate:帧率

  10. attached_pic :封面图,比如说一些MP3,AAC音频文件附带的专辑封面。

  11. side_data nb_side_data: 一整个流的附加信息的集合,解复用由libavformat设置,复用由avformat_write_header设置

### FFmpeg 中 AVFormatContext 的定义与使用 #### AVFormatContext 结构体概述 `AVFormatContext` 是 FFMPEG 库中至关重要的数据结构之一,在整个多媒体处理流程中扮演着核心角色。该结构不仅用于解封装操作,还涵盖了多种媒体文件格式的支持[^1]。 此结构体包含了关于媒体文件或流的各种元信息,如编码器配置、时间戳基数、比特率等,并且提供了访问底层 I/O 和协议层的功能接口[^4]。 #### 主要成员变量解释 以下是 `AVFormatContext` 中一些重要字段及其用途: - **iformat / oformat**: 输入/输出格式指针,指向当前打开文件所对应的解析器实例; - **pb (AVIOContext*)**: 文件读写缓冲区对象,负责实际的数据传输工作; - **nb_streams**: 流数量统计; - **streams[] (AVStream)**: 存储各个独立音视频轨道的信息列表; - **duration**: 媒体总长度(单位为微秒),可用于进度条显示等功能实现; - **metadata**: 用户自定义标签集合,比如艺术家名称、专辑封面图片链接等等; 这些属性共同构成了完整的媒体资源描述框架,使得开发者能够方便地获取并操控所需素材特性。 #### 实际应用场景举例 当涉及到具体编程实践时,通常会按照如下方式初始化和释放这个结构体: ```c // 初始化部分 AVFormatContext *fmt_ctx = NULL; if ((ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) < 0) { fprintf(stderr, "无法打开输入文件\n"); exit(1); } if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0) { fprintf(stderr, "未能检索到流信息\n"); exit(1); } // 处理逻辑... // 清理收尾阶段 avformat_close_input(&fmt_ctx); // 关闭并清理关联资源 ``` 上述代码片段展示了如何通过调用库函数来创建一个新的 `AVFormatContext` 对象,并对其进行必要的设置以便后续操作。最后记得适时关闭连接以防止内存泄漏等问题发生。 #### 协议支持机制简介 除了基本的文件I/O外,FFMPEG 还允许用户指定不同的网络传输方案来进行远程资源加载。这依赖于内部维护的一系列 `URLProtocol` 表项,它们各自实现了特定类型的通信握手过程和服务端交互细节[^3]。 例如 HTTP(S), RTMP 等流行的标准都被集成到了官方版本之中,默认情况下即可无缝衔接各种在线直播源或者云盘分享链接等内容形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值