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>& pad){auto caps = pad->get_current_caps();auto stru_name =  caps->get_structure(0).get_name();cout<<"新的pad信号:"<<stru_name<<endl;if (stru_name.find("video") != ustring::npos){if (pad->link(conv->get_static_pad("sink"))!=Gst::PAD_LINK_OK)cerr<<"连接uridecodebin到videoconvert错误"<<endl;}});conv->link(sink);uridecodebin->signal_autoplug_select().connect([uridecodebin](const RefPtr<Pad>& pad, const RefPtr<Caps>& caps, const RefPtr<ElementFactory>& factory ){auto factory_name = factory->get_name();cout<<"Ready to select elementfactory: "<<factory_name<<endl;if (factory->get_name().find("v4l2")!=ustring::npos) {cout<<"nvv4l2decode不适合本机,skip!!!."<<endl;return Gst::AUTOPLUG_SELECT_SKIP;}elsereturn Gst::AUTOPLUG_SELECT_TRY;});

实验结果如下:

0:00:00.034184320  8858 0x55a05c0db800 WARN                 basesrc gstbasesrc.c:3600:gst_base_src_start_complete:<source> pad not activated yet
0:00:00.034510822  8858 0x55a05c0db800 WARN                 basesrc gstbasesrc.c:3600:gst_base_src_start_complete:<source> pad not activated yet
Ready to select elementfactory: qtdemux
0:00:00.040910902  8858 0x55a05c0c2f60 WARN                 qtdemux qtdemux_types.c:239:qtdemux_type_get: unknown QuickTime node type sgpd
0:00:00.040930390  8858 0x55a05c0c2f60 WARN                 qtdemux qtdemux_types.c:239:qtdemux_type_get: unknown QuickTime node type sbgp
0:00:00.040958105  8858 0x55a05c0c2f60 WARN                 qtdemux qtdemux.c:3237:qtdemux_parse_trex:<qtdemux0> failed to find fragment defaults for stream 1
0:00:00.041057273  8858 0x55a05c0c2f60 WARN                 qtdemux qtdemux.c:3237:qtdemux_parse_trex:<qtdemux0> failed to find fragment defaults for stream 2
Ready to select elementfactory: h264parse
Ready to select elementfactory: aacparse
Ready to select elementfactory: avdec_aac
Ready to select elementfactory: nvv4l2decoder
nvv4l2decode不适合本机,skip!!!.
Ready to select elementfactory: avdec_h264

Gstreamer uridecodebin 插件手动选择解码器相关推荐

  1. 手动选择Mplayer正确的解码器可以提高解码效率

    Mplayer拥有上百个解码器,全部集成与mplayer程序本身. Mplayer播放媒体文件时会自动选择解码器进行解码播放,但有时它并不会选择最好的解码器,从而导致无法解码或很卡. 昨天,无聊时蒙到 ...

  2. 小葫芦直播管家找不到服务器,小葫芦直播管家-开播版,直播插件手动安装教程...

    小葫芦直播管家-开播版,直播插件手动安装教程 小葫芦直播管家-开播版最新版本支持添加各种直播插件啦!先给大家分享简单快速的添加方法. 注意:准备好32位的OBS Studio插件!可前往 小葫芦插件市 ...

  3. 【Flutter】插件包选择 ( 查看文档是否全面 | 查看插件包的更新版本次数 | 查看使用示例 | 查看 GitHub 项目的 Star Fork Issues )

    文章目录 一.插件包选择 二.查看文档是否全面 三.查看插件的更新版本次数 四.查看使用示例 五.查看 GitHub 项目的 Star Fork Issues 一.插件包选择 开发 Flutter 时 ...

  4. Nginx负载均衡实现之用户手动选择与DNS轮询

    负载均衡常用的处理方式 方式一:用户手动选择 这种方式比较原始,只要实现的方式就是在网站主页上面提供不同线路.不同服务器链接方式,让用户来选择自己访问的具体服务器,来实现负载均衡. 方式二:DNS轮询 ...

  5. 再议 语法高亮插件的选择

    之前一篇<为博客园选择一个小巧霸气的语法高亮插件>介绍了语法高亮插件的选择,当时只注重速度了. 这些天在做深度定制的时候发现一个严重的问题,匹配精度不够. 什么是匹配精度呢? 简单说就是没 ...

  6. (转)基于MVC4+EasyUI的Web开发框架经验总结(1)-利用jQuery Tags Input 插件显示选择记录...

    http://www.cnblogs.com/wuhuacong/p/3667703.html 最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开 ...

  7. vue element-ui只有一条信息时默认选中按钮,且不能取消,多条信息时可以手动选择

    vue element-ui只有一条信息时默认选中按钮,且不能取消,多条信息时可以手动选择 用lodash方法进行原数据的深拷贝 // 编辑多规格产品时必须选中一个默认规格setColumnData( ...

  8. notepad++ JSON Viewer插件手动安装失败解决方案

    解压把 .dll文件放到plugins文件下 [设置]->>>[导入]->>>[导入插件]->>>选择.dll文件->>>重启就 ...

  9. OBS插件开发以及OBS插件的选择(obs直播插件)

    obs版本的选择: 工作室版,优化了很多东西,缺点是不能用插件,在部分机型不稳定,因为更新的很频繁.不过这个插件不能用的说法还是停留在早起,截至到今天已经完美支持,所以在不久的将来会越来越好,如果是开 ...

  10. 移动端H5实现手动选择地图点的一种解决方案

    一.准备 文中所用地图应用为高得地图v1.4.15版,代码开发环境为Vue.js框架+webpack+node.js. 二.需求 移动端H5实现类似打车软件中在地图界面手动选择目的地功能.效果如图. ...

最新文章

  1. DNS,edns,httpdns杂谈
  2. 可解释性 or 准确性?AI 模型就一定不能两者兼得吗?
  3. 《Windows CE大排档》第一版勘误表
  4. 哈佛最新成果:温度高于25℃可降低新冠病毒传染率,但不足以完全控制疫情...
  5. 用python做炒股软件-python程序源码_基于python的炒股软件
  6. spss主成分综合得分_使用SPSS对美国50个州情况分析
  7. MATLAB常用的基本数学函数
  8. 证明$A^TAX = A^Tb$有公共解
  9. Altium Designer四层板起步
  10. C# List;数组[] 转 List 和 List 拼接
  11. 基于Arduino控制伺服电机(舵机)
  12. SWF (Simple Workflow Service)简介
  13. Android 动态修改app名称(市场和手机中显示两个不同的名称)
  14. java中的package_JAVA中的PACKAGE机制——(好文转帖)
  15. linux系统下sendmail的搭建
  16. Linux——网络与配置
  17. leetcode 545. Boundary of Binary Tree
  18. CIO必读:平常心走IT路 吴正宏经历的信息化三十年
  19. 第十四届蓝桥杯三月真题刷题训练——第 13 天
  20. java.lang.IllegalStateException: Shutdown in progress 异常已解决

热门文章

  1. C语言程序设计专项练习——PTA
  2. java 报表模版 打印_Java报表工具技巧--如何使用Style Report制作以及打印标签
  3. 小程序 Vant Weapp 使用插槽自定义 Cell 的左侧图标
  4. vscode 搭建Vue项目及引入elementUI
  5. 1.44TFT彩屏字体翻转,扫描方式的改变
  6. 民间借贷、网贷vs信用卡
  7. 有Pytz时区列表吗?
  8. 自相关函数与互相关函数
  9. arduiono电子音乐代码_使用Word2003的EQ域代码制作音乐简谱
  10. 网友在各自领域中所用到的芯片总结(转载)