FFmpeg如何使用编码器
首先跟编码相关的结构体如下:
1,AVCodecContext
,这个结构体可以是 编码器 的上下文,也可以是 解码器 的上下文,两者使用的是同一种数据结构。
2,AVCodec
,编解码信息。
3,AVCodecParameters
,编解码参数。
4,AVPacket
, YUV经过编码压缩之后的数据,在 《AVPacket结构体使用介绍》有介绍。
5,AVFrame
,解码之后的 YUV 数据。AVFrame
跟 AVPacket
类似,都是一个管理数据的结构体,他们本身是没有数据的,只是引用了数据。
跟编码相关的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
里面提取宽高,像素格式这些东西。宽高,像素之类的信息