Gstreamer uridecodebin 插件手动选择解码器
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 插件手动选择解码器相关推荐
- 手动选择Mplayer正确的解码器可以提高解码效率
Mplayer拥有上百个解码器,全部集成与mplayer程序本身. Mplayer播放媒体文件时会自动选择解码器进行解码播放,但有时它并不会选择最好的解码器,从而导致无法解码或很卡. 昨天,无聊时蒙到 ...
- 小葫芦直播管家找不到服务器,小葫芦直播管家-开播版,直播插件手动安装教程...
小葫芦直播管家-开播版,直播插件手动安装教程 小葫芦直播管家-开播版最新版本支持添加各种直播插件啦!先给大家分享简单快速的添加方法. 注意:准备好32位的OBS Studio插件!可前往 小葫芦插件市 ...
- 【Flutter】插件包选择 ( 查看文档是否全面 | 查看插件包的更新版本次数 | 查看使用示例 | 查看 GitHub 项目的 Star Fork Issues )
文章目录 一.插件包选择 二.查看文档是否全面 三.查看插件的更新版本次数 四.查看使用示例 五.查看 GitHub 项目的 Star Fork Issues 一.插件包选择 开发 Flutter 时 ...
- Nginx负载均衡实现之用户手动选择与DNS轮询
负载均衡常用的处理方式 方式一:用户手动选择 这种方式比较原始,只要实现的方式就是在网站主页上面提供不同线路.不同服务器链接方式,让用户来选择自己访问的具体服务器,来实现负载均衡. 方式二:DNS轮询 ...
- 再议 语法高亮插件的选择
之前一篇<为博客园选择一个小巧霸气的语法高亮插件>介绍了语法高亮插件的选择,当时只注重速度了. 这些天在做深度定制的时候发现一个严重的问题,匹配精度不够. 什么是匹配精度呢? 简单说就是没 ...
- (转)基于MVC4+EasyUI的Web开发框架经验总结(1)-利用jQuery Tags Input 插件显示选择记录...
http://www.cnblogs.com/wuhuacong/p/3667703.html 最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开 ...
- vue element-ui只有一条信息时默认选中按钮,且不能取消,多条信息时可以手动选择
vue element-ui只有一条信息时默认选中按钮,且不能取消,多条信息时可以手动选择 用lodash方法进行原数据的深拷贝 // 编辑多规格产品时必须选中一个默认规格setColumnData( ...
- notepad++ JSON Viewer插件手动安装失败解决方案
解压把 .dll文件放到plugins文件下 [设置]->>>[导入]->>>[导入插件]->>>选择.dll文件->>>重启就 ...
- OBS插件开发以及OBS插件的选择(obs直播插件)
obs版本的选择: 工作室版,优化了很多东西,缺点是不能用插件,在部分机型不稳定,因为更新的很频繁.不过这个插件不能用的说法还是停留在早起,截至到今天已经完美支持,所以在不久的将来会越来越好,如果是开 ...
- 移动端H5实现手动选择地图点的一种解决方案
一.准备 文中所用地图应用为高得地图v1.4.15版,代码开发环境为Vue.js框架+webpack+node.js. 二.需求 移动端H5实现类似打车软件中在地图界面手动选择目的地功能.效果如图. ...
最新文章
- DNS,edns,httpdns杂谈
- 可解释性 or 准确性?AI 模型就一定不能两者兼得吗?
- 《Windows CE大排档》第一版勘误表
- 哈佛最新成果:温度高于25℃可降低新冠病毒传染率,但不足以完全控制疫情...
- 用python做炒股软件-python程序源码_基于python的炒股软件
- spss主成分综合得分_使用SPSS对美国50个州情况分析
- MATLAB常用的基本数学函数
- 证明$A^TAX = A^Tb$有公共解
- Altium Designer四层板起步
- C# List;数组[] 转 List 和 List 拼接
- 基于Arduino控制伺服电机(舵机)
- SWF (Simple Workflow Service)简介
- Android 动态修改app名称(市场和手机中显示两个不同的名称)
- java中的package_JAVA中的PACKAGE机制——(好文转帖)
- linux系统下sendmail的搭建
- Linux——网络与配置
- leetcode 545. Boundary of Binary Tree
- CIO必读:平常心走IT路 吴正宏经历的信息化三十年
- 第十四届蓝桥杯三月真题刷题训练——第 13 天
- java.lang.IllegalStateException: Shutdown in progress 异常已解决