ffmpeg-2-常用数据结构详解

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 *);
……

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;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值