软编插件x264enc
gstreamer提供了软编码插件x264enc,x264enc是对软编码库x264的封装,如下图是插件的部分信息。
x264enc的基类是videoencoder, videoencoder是框架,它定义了chain函数gst_video_encoder_chain,这个函数包了一些虚函数,需要子类去实现,如:klass->handle_frame。
获取接口函数
x264_element_init
--load_x264_libraries
----load_x264
------LOAD_SYMBOL (x264_encoder_encode)......; //获取所有接口函数。
x264enc的实现
gstencoder_class->handle_frame =
GST_DEBUG_FUNCPTR (gst_x264_enc_handle_frame);
gst_x264_enc_handle_frame
--gst_x264_enc_encode_frame
----encoder->vtable->x264_encoder_encode
x264enc的日志
gst_x264_enc_encode_frame
if (pic_out.b_keyframe) {
GST_DEBUG_OBJECT (encoder, "Output keyframe"); // 关键帧时打印
}
输出打印:
x264enc gstx264enc.c:2578:gst_x264_enc_encode_frame:<sink_sub_bin_encoder1>[00m output: dts 3599999933333334 pts 3600000000000000
gstvideoencoder.c:2097:gst_video_encoder_finish_frame:<sink_sub_bin_encoder1>[00m frame PTS 1000:00:00.000000000, DTS 999:59:59.933333334
x264enc的bug
1. x264定义了b帧间隔参数bframes,但是没有将此值设给编码参数,在gst_x264_enc_init_encoder中会做参数设置,如下是设置宽:
encoder->x264param.i_width = info->width;
硬件编码插件nvvideo4linux2
链接: nvvideo4linux2
未完待续。