FFmpeg中的libx264编码流程
2019-04-16 本文已影响2人
smallest_one
目录
- 参考
- 概述
- FFmpeg中的libx264编码流程
1. 参考
2. 概述
本文主要参考[1],为了更加清晰地展现出编码过程中FFmpeg与libx264的交互流程。
编码流程主要有三个步骤:
- 编码器初始化:打开编码器并设置各种编码参数。
- 编码:输入待编码的图像数据和一些参数,获取编码后的数据。
- 关闭编码器:释放各种资源。
FFmpeg的编解码的API详细介绍可参考FFmpeg音频解码#编解码API介绍部分。
3. FFmpeg中的libx264编码流程
FFmpeg的libx264编码器AVCodec ff_libx264_encoder
定义在libavcodec/libx264.c
。是H.264编码库libx264的一个wrapper,libavcodec和libx264中间的一个代理,必要时对libx264和FFmpeg定义的一些数据结构进行转换。
3.1 编码器初始化
ff_libx264_encoder#init.png- 虚线的箭头表示在某些特定情况下会调用。
- 以x264开头的结构体和函数为libx264中定义的。
- x264_param_default():设置默认参数。
- x264_param_default_preset():设置默认的preset,在preset或tune不为空时设置。
- x264_param_apply_profile():设置profile,在profile不为空时设置。
- 设置的各种参数有两个来源:
AVCodecContext
和X264Context
,X264Context
保存在AVCodecContext.priv_data
中。AVCodecContext
包含了一些编码器的通用选项。X264Context
包含了一些libx264的特有选项。 - x264_encoder_open():打开编码器,返回一个编码器句柄
x264_t *
。 - x264_encoder_headers():需要全局头的时候,输出头信息。
3.2 编码
ff_libx264_encoder#encode.png-
x264_encoder_encode
为执行编码的函数,输入的待编码的数据为x264_picture_t
中,输出的编码数据为x264_nal_t
数组。 - 在输入端
ff_libx264_encoder
把AVFrame
中的待编码的数据的buffer地址赋给了x264_picture_t
中的对应变量,数据buffer是原来AVFrame
中分配的,没有数据拷贝的过程。 - 在输出端
ff_libx264_encoder
把已编码的数据从x264_nal_t
数组拷贝到AVPacket
中。 - x264_encoder_delayed_frames:返回当前延迟的(缓冲的)帧的数量。
x264_encoder_encode
的调用会循环进行直到x264_encoder_delayed_frames
返回的值为0,图中没有表示出来。