1.实现打开和关闭输入文件和输出文件的操作
2.视频编码器的初始化(在介绍这部分内容之前,先来了解一下几个非常重要的结构体:AVCodec,AVCodecContext,AVPacket以及AVFrame)
AVCodec:
AVCodec类型的结构包含了FFmpeg libavcodec对一个编码器底层实现的封装,其内部定义的部分结构如下:
AVCodecContext:
在FFmpeg中,每一个编码器都对应一个上下文结构;在编码开始前,可以通过该结构配置相应的编码参数,比如:编码的profile,图像的宽和高,关键帧间距,码率和帧率等。对于其他编码器(如libx264)的私有参数,AVCodecContext结构可以使用成员priv_data保存编码器的配置信息。该结构的部分定义如下:
AVFrame:
在FFmpeg中,未压缩的图像用AVFrame结构来表示。在AVFrame结构中,所包含的最重要的结构即图像数据的缓存区。待编码图像的像素数据保存在AVFrame结构的data指针所指向的内存区。在保存图像像素数据时,存储区的宽度有时会大于图像的宽度,这时可以在每一行像素的末尾填充字节。此时,存储区的宽度可以通过AVFrame的linesize获取。其内部定义的部分结构如下:
AVPacket:
AVPacket结构用于保存未解码的二进制码流的一个数据包,在该结构中,码流数据保存在data指针指向的内存区中,数据长度为size字节。在从编码器获取到输出的AVPacket结构后,可以通过data指针和size值读取编码后的码流。其内部定义的部分结构如下:
编码器初始化的代码如下:
3.编码循环体 在编码循环体中,至少需要实现以下三个功能: (1)从视频源中循环获取输入图像 (2)将当前帧传入编码器进行编码,获取输出的码流包 (3)输出码流包中的压缩码流到输出文件 读取图像数据和写出码流数据:
编码一帧图像数据:
编码循环体的整体实现:
关闭编码器:
最终main函数的实现如下:
执行完成后会生成码流文件output.h264,使用ffplay可以播放该文件,查看编码结果。