本文共 3351 字,大约阅读时间需要 11 分钟。
//libx264对应的AVCodec结构体AVCodec ff_libx264_encoder = { .name = "libx264", .long_name = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_H264, .priv_data_size = sizeof(X264Context),//与之对应的x264的AVCodeContext中的void * priv_data👉👉👉X264Context *x4 .init = X264_init, .encode2 = X264_frame, .close = X264_close, .capabilities = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS, .priv_class = &x264_class, .defaults = x264_defaults, .init_static_data = X264_init_static,};从ff_libx264_encoder定义中可以看出: init()指向X264_init(), encode2()指向 X264_frame(), close()指向 X264_close()。此外priv_class指向一个x264_class静态结构体,该结构体是libx264对应的AVClass,定义如下。static const AVClass x264_class = { .class_name = "libx264", .item_name = av_default_item_name, .option = options,//选项 .version = LIBAVUTIL_VERSION_INT,};x264_class中的option指向一个options[]静态数组,其中包含了libx264支持的AVOption选项,如下所示。//FFmpeg针对libx264提供的可以通过AVOption设置的选项#define OFFSET(x) offsetof(X264Context, x)#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAMstatic const AVOption options[] = { { "preset", "Set the encoding preset (cf. x264 --fullhelp)", OFFSET(preset), AV_OPT_TYPE_STRING, { .str = "medium" }, 0, 0, VE}, { "tune", "Tune the encoding params (cf. x264 --fullhelp)", OFFSET(tune), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE}, { "profile", "Set profile restrictions (cf. x264 --fullhelp) ", OFFSET(profile), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE}, { "fastfirstpass", "Use fast settings when encoding first pass", OFFSET(fastfirstpass), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE}, { "level", "Specify level (as defined by Annex A)", OFFSET(level), AV_OPT_TYPE_STRING, { .str=NULL}, 0, 0, VE}, { "passlogfile", "Filename for 2 pass stats", OFFSET(stats), AV_OPT_TYPE_STRING, { .str=NULL}, 0, 0, VE}, { "wpredp", "Weighted prediction for P-frames", OFFSET(wpredp), AV_OPT_TYPE_STRING, { .str=NULL}, 0, 0, VE}, { "x264opts", "x264 options", OFFSET(x264opts), AV_OPT_TYPE_STRING, { .str=NULL}, 0, 0, VE}, ....... { NULL },};options[]数组中包含的选项支持在FFmpeg中通过AVOption进行设置。
下面是3个主要函数:初始化 编码 关闭
X264_init()调用了如下函数: [libx264 API] x264_param_default():设置默认参数。//传参AVCodecContext👉👉决定avctx->priv_data(x264context)中的参数 priv_data(x264context)中的部分参数决定另一部分参数 [libx264 API] x264_param_default_preset():设置默认preset。 convert_pix_fmt():将FFmpeg像素格式转换为libx264像素格式。 [libx264 API] x264_param_apply_profile():设置Profile。 [libx264 API] x264_encoder_open():打开编码器。 [libx264 API] x264_encoder_headers():需要全局头的时候,输出头信息。X264_init()主要将各种选项值传递给libx264。这些选项有两个来源:AVCodecContext和X264Context。 AVCodecContext中包含了编码器的一些通用选项, 而X264Context包含了一些libx264特有的选项。//FFmpeg中的一些选项的单位和libx264中对应选项的单位是不一样的,因此需要做一些转换。例如像素格式的转换函数convert_pix_fmt()就是完成了这个功能。X264_frame()调用了如下函数://输入:AVFrame //↓格式转换↓ [libx264 API] x264_encoder_encode():编码一帧数据。 //输入x264_picture_t //输出x264_nal_t [libx264 API] x264_encoder_delayed_frames():输出编码器中缓存的数据。 encode_nals():将编码后得到的x264_nal_t转换为AVPacket。 //输入:x264_nal_t👉👉输出:AVPacket //将sei数据+多个nal数据连续写入packet->dataX264_close()调用了如下函数: [libx264 API] x264_encoder_close():关闭编码器。
转载地址:http://zbhrn.baihongyu.com/