deepstream-编解码

软编插件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

未完待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山西茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值