FFmpeg 基本数据结构 AVPacket分析
1、AVPacket 说明
AVPacket 是 FFmpeg 多媒体框架中承载压缩编码数据的核心容器,作为编解码器与解复用器/复用器之间的数据传输单元,它在多媒体处理流水线中扮演着至关重要的角色。
AVPacket 是 FFmpeg 中用于存储压缩后的编码数据(Encoded Data)的结构体。 它是多媒体处理流水线中解复用器(Demuxer)的输出和解码器(Decoder)的输入。
简单来说:
- AVFrame 存储的是未压缩的原始数据(一张图片的像素、一段音频的采样)。
- AVPacket 存储的是压缩后的编码数据(一帧 H.264 数据、一段 AAC 数据)
AVPacket 的核心作用:
- 数据容器:承载压缩编码数据(视频帧/音频帧)
- 时间载体:精确传递 PTS/DTS 时间信息
- 流关联器:通过 stream_index 绑定媒体流
- 元数据载体:传输 SEI 信息、加密数据等附加内容
- 流水线枢纽:连接解复用、解码、编码、复用各模块
2、AVPacket 具体成员定义
typedef struct AVPacket {AVBufferRef *buf; // 指向一个AVBufferRef结构的指针,用于存储数据int64_t pts; // 显示时间戳int64_t dts; // 解码时间戳uint8_t *data; // 指向数据的指针int size; // 数据大小int stream_index; // 流索引int flags; // 标志AVPacketSideData *side_data; // 指向AVPacketSideData结构的指针,用于存储侧数据int side_data_elems; // 侧数据元素数量int64_t duration; // 持续时间int64_t pos; // 文件位置void *opaque; // 透明数据AVBufferRef *opaque_ref; // 指向一个AVBufferRef结构的指针,用于存储透明数据AVRational time_base; // 时间基准
} AVPacket;
各个成员的含义如下:
- buf: 一个指向AVBufferRef结构的指针,用于存储数据。
- pts: 一个int64_t类型的整数,表示显示时间戳。
- dts: 一个int64_t类型的整数,表示解码时间戳。
- data: 一个uint8_t类型的指针,指向数据。
- size: 一个整数,表示数据大小。
- stream_index: 一个整数,表示流索引。
- flags: 一个整数,表示标志。
- side_data: 一个指向AVPacketSideData结构的指针,用于存储侧数据。
- side_data_elems: 一个整数,表示侧数据元素数量。
- duration: 一个int64_t类型的整数,表示持续时间。
- pos: 一个int64_t类型的整数,表示文件位置。
- opaque: 一个void类型的指针,表示透明数据。
- opaque_ref: 一个指向AVBufferRef结构的指针,用于存储透明数据。
- time_base: 一个AVRational结构体,表示时间基准。
3、AVPacket 核心组件解析
- 数据存储字段:

- 时间信息字段:

