首先跟编码相关的结构体如下:

1,AVCodecContext,这个结构体可以是 编码器 的上下文,也可以是 解码器 的上下文,两者使用的是同一种数据结构。

2,AVCodec,编解码信息。

3,AVCodecParameters,编解码参数。

4,AVPacket , YUV经过编码压缩之后的数据,在 《AVPacket结构体使用介绍》有介绍。

5,AVFrame ,解码之后的 YUV 数据。AVFrameAVPacket 类似,都是一个管理数据的结构体,他们本身是没有数据的,只是引用了数据。

编码相关的API函数如下:

1,avcodec_alloc_context3,通过传递 AVCodec 编解码信息来初始化上下文。

2,avcodec_open2,打开一个编码器 或者 解码器。

2,avcodec_is_open,判断 一个编码器 或者 解码器 是否打开

3,avcodec_send_frame,往 AVCodecContext 编码器 发送一个 AVFrame

4,avcodec_receive_packet,从 AVCodecContext 编码器 读取一个 AVPacket

视频编码的步骤:

[1] 初始化打开输出文件时构建编码器上下文

[2] 视频帧编码

[2.1] 设置帧类型 "frame->pict_type=AV_PICTURE_TYPE_NONE",让编码器根据设定参数自行生成 I/B/P 帧类型

[2.2] 将原始帧送入编码器,从编码器取出编码帧

[2.3] 更新编码帧流索引

[2.4] 将帧中时间参数按输出封装格式的时间基进行转换

打开编码器的代码量比打开解码器要多,这是因为 打开解码器 可以调 avcodec_parameters_to_context 把流的宽高等信息直接复制到 AVCodecContext

而编码器,需要从 AVFrame 里面提取宽高,像素格式这些东西。宽高,像素之类的信息