软编插件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)......; //获取所有接口函数。
设置编码参数
x264_encoder_open (&encoder->x264param)
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
如果没有设置bframes,默认是有b帧的。如果设了bframes,会按设置的参数进行编码。
gst-launch-1.0 filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! nvvideoconvert ! 'video/x-raw,format=I420' ! x264enc bframes=0 ! filesink location=test.264
这个bframes是怎么传下去的呢?设置了属性后,会将只传递给option_string。
// * Parse option string and assign to x264 parameters
gst_x264_enc_parse_options会将字符串解析然后传给编码参数,如下代码:
encoder->vtable->x264_param_parse (&encoder->x264param, key_val[0],
key_val[1]);
在gst_x264_enc_init_encoder中会做参数设置,如下例子:
encoder->x264param.b_annexb = encoder->byte_stream;
如下是设置宽:
encoder->x264param.i_width = info->width;
硬件编码插件nvvideo4linux2
链接: nvvideo4linux2
未完待续。