常用库:
avcodec:编解码(最重要的库)
avformat:封装格式处理
avfilter:滤镜特效处理
avdevice:各种设备的输入输出
avutil:工具库(大部分库都需要该库支持)
postproc:后加工
swresample:音频采样数据格式转换
swscale:视频像素数据格式转换
常用数据结构:
AVFormatContext:
typedef struct AVFormatContext
{
//指向 AVInputFormat,如对于 mp4 或 mov 为 ff_mov_demuxer
struct AVInputFormat *iformat;
/**
* The output container format.
*
* Muxing only, must be set by the caller before avformat_write_header().
*/
struct AVOutputFormat *oformat;
// 指向具体的格式对应的 Context,如:MovContext。
void *priv_data;
//指向数据读取统一接口 context
ByteIOContext pb;
//流的数目
int nb_streams;
//至少 2 个指针元素分别指向 video stream 和 audio stream
AVStream *streams[MAX_STREAMS];
} AVFormatContext;
AVFormatContext结构表示程序运行的当前文件容器格式所使用的上下文,着重于所有文件容器共有的属性(并且是在
程序运行时才能确定其值)和关联其他结构的字段。priv_data 字段关联各个具体文件容器独有的属性上下文,和 priv_data_size 配对使用
struct AVInputFormat *iformat:输入数据的封装格式
struct AVOutputFormat *oformat:输出数据的封装格式
AVIOContext *pb:输入数据的缓存
unsigned int nb_streams:视音频流的个数
AVStream **streams:视音频流
char filename[1024]:文件名
int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)
int bit_rate:比特率(单位bps,转换为kbps需要除以1000)
AVDictionary *metadata:元数据
AVOutputFormat:
AVOutputFormat 结构主要包含的信息有:封装名称描述,编码格式信息(video/audio 默认编码格式,支持的编码格式列表),一些对封装的操作函数(write_header,write_packet,write_tailer等)。其中,AVOutputFormat没有实现AVClass接口,但它保存了一个AVClass接口,具体怎样被使用则由后续决定。例如:MOV类的AVOutputFormat封装保存的是 针对 MOVMuxContext 结构的 AVClass 接口实现。
typedef struct AVOutputFormat {
const char *name;
/**
* Descriptive name for the format, meant to be more human-readable
* than name. You should use the NULL_IF_CONFIG_SMALL() macro
* to define it.
*/
//编码格式信息(video/audio 默认编码格式,支持的编码格式列表)
enum AVCodecID audio_codec; /**< default audio codec */
enum AVCodecID video_codec; /**< default video codec */
enum AVCodecID subtitle_codec; /**< default subtitle codec */
} AVOutputFormat;
AVInputFormat:
AVInputFormat是类似COM接口的数据结构,表示输入文件容器格式,着重于功能函数,一种文件容器格式对应一个AVInputFOrmat结构,在程序运行时有多个实例,next变量用于把所有支持的输入文件容器格式连接成链表,便于便利查找,priv_data_size标示具体的文件容器格式对应的Context大小
typedef struct AVInputFormat
{
// 标示 format 的名字, 比如,“mov” “mp4” 等。
const char *name;
// 标示具体的 format 对应的 Context 的 size,如:MovContext。
int priv_data_size;
//具体的操作函数
int(*read_probe)(AVProbeData*);
int(*read_header)(struct AVFormatContext *,AVFormatParameters *ap);
int(*read_packet)(struct AVFormatContext *, AVPacket *pkt);
int(*read_close)(struct AVFormatContext*);
struct AVInputFormat *next;
} AVInputFormat;
AVCodecContext:
AVCodecContext结构表示程序运行的当前Codec的上下文,着重于当前所有Codec共有的属性(并且是在程序运行时才能确定其值)和关联其他结构的字段。extradata 和 extradata_size 两个字段表述了相应 Codec 使用的私有数据;codec 字段关联相应的编解码器;priv_data 字段关联各个具体编解码器独有的属性 context,和 AVCodec 结构中的 priv_data_size 配对使用
typedef struct AVCodecContext
{
int bit_rate;
int frame_number;
//扩展数据,如 mov 格式中 audio trak 中 aac 格式中 esds 的附加解码信息。
unsigned char *extradata;
//扩展数据的 size
int extradata_size;
//视频的原始的宽度与高度
int width, height; // 此逻辑段仅针对视频
//视频一帧图像的格式,如 YUV420
enum PixelFormat pix_fmt;
//音频的采样率
int sample_rate;
//音频的声道的数目
int channels;
int bits_per_sample;
int block_align;
// 指向相应的解码器,如:ff_h264_decoder
struct AVCodec *codec;
//指向具体相应的解码器的 context,如 H264Context
void *priv_data;
//公共操作函数
int(*get_buffer)(struct AVCodecContext *c, AVFrame *pic);
void(*release_buffer)(struct AVCodecContext *c, AVFrame *pic);
int(*reget_buffer)(struct AVCodecContext *c, AVFrame *pic);
}AVCodecContext;
AVCodec:
AVCodec是类似COM接口的数据结构,表示音视频编解码器,着重于功能函数,一种媒体类型对应一个AVCodec结构,在程序运行时有多个实例。next 变量用于把所有支持的编解码器连接成链表,便于遍历查找;id 确定了 唯 一编 解 码器 ; priv_data_size 表示具 体 的 Codec 对应的 Context 结构大 小
typedef struct AVCodec
{
// 标示 Codec 的名字, 比如,"h264" "h263" 等。
const char *name;
// 标示 Codec 的类型,有 video ,audio 等类型。
enum CodecType type;
// 标示 Codec 的 ID,有 CODEC_ID_H264 等。
enum CodecID id;
// 标示具体的 Codec 对应的 Context 的 size,如:H264Context。
int priv_data_size;
// 以下标示 Codec 对外提供的操作,每一种解码器都会实现这些操作。
int(*init)(AVCodecContext*);
int(*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);
int(*close)(AVCodecContext*);
int(*decode)(AVCodecContext *, void *outdata, int *outdata_size, uint8_t *buf, int
buf_size);
struct AVCodec *next;
}AVCodec;
AVStream:
AVStream结构表示当前媒体流的上下文,着重于所有媒体流共有的属性(并且是在程序运行时才能确定其值)和关联其他结构的字段,actx字段关联当前音视频媒体所使用的编解码器的context;priv_data 字段关联解析各个具体媒体流解复用拆包用的ontext;还有关键帧的索引表也存于此
typedef struct AVStream
{
//指向解码器 context,用于关联解码器
AVCodecContext *actx;
//codec 解析器,每一种编码器在进行压缩时都会对实际负载数据进行封装,加//入头信息,如 h264,需
//要解析 nal单元,关联通过 avav_find_stream_info()
struct AVCodecParserContext *parser;
//指向解复用的流的 context,比如 mp4 的 MovStreamcontext
void *priv_data;
AVRational time_base;
//用于 seek 时使用,用于快速索引关键帧,如 flv 的 keyframes 索引表和 mp4 的 I
//帧的索引表都存于此,很重要
AVIndexEntry *index_entries;
//index_entries 的元素的个数
int nb_index_entries;
int index_entries_allocated_size;
double frame_last_delay;
} AVStream;
AVPacket:
AVPacket 代表音视频数据帧,固有的属性是一些标记,时钟信息,和压缩数据首地址,大小等信息
typedef struct AVPacket
{
//显示时间戳
int64_t pts;
//解码时间戳
int64_t dts;
//记录在文件或网络中的流中的字节的位置
int64_t pos;
//实际数据指针
uint8_t *data;
//实际的数据的大小
int size;
//该 packet 所属的流的索引,一般为 0 或者 1
int stream_index;
int flags;
//析构函数
void(*destruct)(struct AVPacket*);
} AVPacket;
AVFrame:
AVFrame结构体一般用于存储原始数据(即非压缩数据,例如对视频来说是 YUV,RGB,对音频来说是 PCM),此外还包含了一些相关的信息。比如说,解码的时候存储了宏块类型表,QP 表,运动矢量表等数据。编码的时候也存储了相关的数据。因此在使用 FFMPEG 进行码流分析的时候,AVFrame 是一个很重要的结构体
typedef struct AVFrame {
#define AV_NUM_DATA_POINTERS 8
uint8_t *data[AV_NUM_DATA_POINTERS];
int linesize[AV_NUM_DATA_POINTERS];
uint8_t **extended_data;
/**宽高 */
int width, height;
int nb_samples;
int format;
/**是否是关键帧*/
int key_frame;
/**帧类型(I,B,P)*/
enum AVPictureType pict_type;
uint8_t *base[AV_NUM_DATA_POINTERS];
AVRational sample_aspect_ratio;
int64_t pts;
int64_t pkt_pts;
int64_t pkt_dts;
int coded_picture_number;
int display_picture_number;
int quality;
int reference;
/**QP 表*/
int8_t *qscale_table;
int qstride;
int qscale_type;
/**跳过宏块表 */
uint8_t *mbskip_table;
/**运动矢量表*/
int16_t (*motion_val[2])[2];
/**宏块类型表 */
uint32_t *mb_type;
/**DCT 系数 */
short *dct_coeff;
/**参考帧列表 */
int8_t *ref_index[2];
void *opaque;
uint64_t error[AV_NUM_DATA_POINTERS];
int type;
int repeat_pict;
int interlaced_frame;
int top_field_first;
int palette_has_changed;
int buffer_hints;
AVPanScan *pan_scan;
int64_t reordered_opaque;
void *hwaccel_picture_private;
struct AVCodecContext *owner;
void *thread_opaque;
/**
* log2 of the size of the block which a single vector in motion_val represents:
* (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)
* - encoding: unused
* - decoding: Set by libavcodec.
*/
uint8_t motion_subsample_log2;
/**(音频)采样率 */
int sample_rate;
uint64_t channel_layout;
int64_t best_effort_timestamp;
int64_t pkt_pos;
int64_t pkt_duration;
AVDictionary *metadata;
int decode_error_flags;
#define FF_DECODE_ERROR_INVALID_BITSTREAM 1
#define FF_DECODE_ERROR_MISSING_REFERENCE 2
int64_t channels;
} AVFrame;