1. AVFormatContext
描述媒体文件或媒体流构成和基本信息,封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式相关信息
ffmpeg/libavformat/avformat.h
// 用于记录和@ref avoptions的类。由avformat_alloc_context()设置。
const AVClass *av_class;
// 输入数据的格式
ff_const59 struct AVInputFormat *iformat;
// 输出数据格式
ff_const59 struct AVOutputFormat *oformat;
// I / O上下文。
AVIOContext *pb;
//AVFormatContext.streams中的元素数量。 由avformat_new_stream()设置,不得被任何其他代码修改。
unsigned int nb_streams;
// 文件中所有流的列表。
AVStream **streams;
// 输入或输出文件名
char filename[1024];
// 第一帧开始时间、总时长、码率
start_time、duration、bit_rate
// 元数据
AVDictionary *metadata;
2. AVInputFormat
保存input数据的格式信息
ffmpeg/libavformat/avformat.h
// 以逗号分隔的格式短名称列表
const char *name;
// 封装格式的扩展名
const char *extensions;
// 以逗号分隔的mime类型列表。用于在探测时检查匹配的mime类型。
const char *mime_type;
//编解码器ID。
int raw_codec_id;
// 后面就是一系列封装格式处理的接口函数
int (*read_play)(struct AVFormatContext *);
int (*read_pause)(struct AVFormatContext *);
……
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
3. AVCodecContext
描述编解码器上下文的数据结构,包含编解码器需要的参数信息(位于:avcodec.h),编码器上下文结构体,保存了视频(音频)编解码相关信息
ffmpeg/libavcodec/Avcodec.h
// 编解码器的AVCodec
const struct AVCodec *codec;
// 码率设置、宽高等信息
bit_rate、bit_rate_tolerance、global_quality、compression_level、width、height、gop_size
等等
4. AVStream
描述媒体流的信息,视频中每个音视频流对应一个该结构体
ffmpeg/libavformat/avformat.h
// 视频/音频流的AVCodecContext
AVCodecContext *codec;
// 时间基准,真正的时间 =PTS*time_base
AVRational time_base;
// 基础信息,开始时间、总时长、帧数等
start_time、duration、nb_frames
// 元数据信息
AVDictionary *metadata;
// 对于具有AV_DISPOSITION_ATTACHED_PIC处理的流,此数据包将包含附加的图片。decoder由libavformat设置,encoder不用到
AVPacket attached_pic;
// 与此流关联的编解码器参数。 分别在avformat_new_stream和avformat_free_context中通过libavformat分配和释放。
AVCodecParameters * codecpar;
// parser
struct AVCodecParserContext *parser;
// 显示帧率
AVRational display_aspect_ratio
5. AVCodec
音视频编解码器
ffmpeg/libavcodec/Avcodec.h
// 编解码器name
const char *name;
// 编解码器类型
enum AVMediaType type;
// 编解码器ID
enum AVCodecID id;
struct AVCodec *next;
// 一些列接口函数
void (*init_static_data)(struct AVCodec *codec);
int (*init)(AVCodecContext *);
int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size, const struct AVSubtitle *sub);
等等
6. AVPacket
此结构存储压缩数据。它通常由解复用器导出,然后作为输入传递给解码器,或作为编码器的输出接收,然后传递给复用器。对于视频,它通常应包含一个压缩帧。对于音频它可能包含几个压缩帧。允许编码器输出空数据包,没有压缩数据,仅包含sidedada。
ffmpeg/libavcodec/Avcodec.h
// 对存储分组数据的引用计数缓冲区的引用。
AVBufferRef *buf;
// 压缩数据.一个AVPacket的data通常对应一个NAL。
uint8_t *data;
// 解码时间戳、显示时间戳
dts、pts
// 标识该AVPacket所属的视频/音频流。
int stream_index;
// 附加数据
AVPacketSideData *side_data;
7. AVFrame
此结构描述解码(原始)音频或视频数据。必须使用av_frame_alloc()分配AVFrame。请注意,这仅分配AVFrame本身,数据的缓冲区必须用av_frame_alloc创建,用av_frame_free释放。
ffmpeg/libavutil/Frame.h
// 存储每行数据的buffer
uint8_t *data[AV_NUM_DATA_POINTERS];
// 对于视频,记录每个图片行的字节大小。对于音频,记录每个plane的字节大小。
int linesize[AV_NUM_DATA_POINTERS];
// 宽高、sample、rate等信息
sample_rate、quality、pkt_dts、coded_picture_number、display_picture_number
// 是否为i帧和帧结构
key_frame、pict_type
// 参考帧的buffer
AVBufferRef *buf[AV_NUM_DATA_POINTERS];
// 附加数据
AVFrameSideData **side_data;
// 元数据、encoder set by user/ decoder set by libavcodec
AVDictionary *metadata;
// QP矩阵
AVBufferRef *qp_table_buf;
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓