Gstreamer uridecodebin 插件手动选择解码器

您所在的位置:网站首页 手动移栽器视频 Gstreamer uridecodebin 插件手动选择解码器

Gstreamer uridecodebin 插件手动选择解码器

2023-03-20 12:53| 来源: 网络整理| 查看: 265

     Gstreamer中的uridecodebin插件使用非常方便,可根据给定的uri,自动选择合适的不同媒体解封装组件和音视频解码器,从而屏蔽了不同媒体的封装类型和解码器的类型。在安装deepstream之前,uridecodebin工作很正常,解码器自动选择的是avdec_h264或者avec_h265插件,但是在装deepstream 5.1之后, uridecodebin便全部使用nvv4l2decode进行解码,nvv4l2decode采用显卡解码,要求显卡有视频编解码核心支持,而我的笔记本的只是一个GeForece MX150,根本没有编解码核心。这就导致每次使用uridecodebin就在解码环节卡住不动了。查阅uridecodebin的文档,发现该bin在选择满足需求的插件的时候,会按照插件的rank值高低,选择高rank值的插件:

  通过gst-inspect查看,nvv4l2decoder的rank值为267, 而avdec_h264的rank值为256,因此自然而然nvv4l2decoder成了第一选择。

   虽然也可以在构建管道的时候使用 filesrc->qtdemux->h264parse->avdec_h264等一众插件替换uridecodebin,但是在deepstream的例程里面大量使用uridecodebin,尤其是在deepstream-app中,代码结构比较复杂,如果更换管道组件,需要大量改写源代码,极易出错。有没有简单的办法,能控制uridecodebin选择哪一种解码器,而不用更改管道结构? 答案是肯定的。

    查阅uridecodebin的文档uridecodebin ,发现有autoplug-factories、autoplug-query、autoplug-select、autoplug-sort等几个信号,其中autoplug-factories信号在 uridecodebin插件发现有满足需要的插件是发出,返回满足该媒体要求的factories数组。autoplug-query是一个查询信号,autoplug-select当uridecodebin准备选择某个插件的时候发出,这里如果返回是GST_AUTOPLUG_SELECT_TRY,则uridecodebin会选择该插件工厂,如果返回是GST_AUTOPLUG_SELECT_SKIP,则uridecodebin会跳过该插件工厂,选择下一个满足条件的插件工厂。

    显然通过连接该信号,就可以控制uridecodebin使用什么插件了。

    用Gstreamermm编写了一段代码实验,其中核心代码为:

uridecodebin->signal_pad_added().connect([uridecodebin,conv](const RefPtr& pad){ auto caps = pad->get_current_caps(); auto stru_name = caps->get_structure(0).get_name(); cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3