下面是在deepstream使用过程中碰到的一些坑:

(1)Pipeline中的Sink如果需要编码存文件或者推rtmp的流,注意控制编码的参数,编码质量不要太高。否则可能Sink带不动,整个Pipeline有数据积累,延时越来越高,程序占用的内存越来越大,最终crash。开发中碰到一个问题:刚开始延时2秒,后来延时慢慢增大,观察发现内存一点点增高。排除了推理性能不够的因素,最后定位编码推rtmp流的时候,分辨率太大(deepstream3.0没有硬编码的插件),导致编码性能不够,后来调整编码分辨率,延时没有积累。这个就像高速出口拥堵,拥堵长度慢慢增加,从匝道一直堵到了主干路。

(2)分析Pipeline的Src有很多种,file、rtsp、rtp等等。个人经验判断,使用rtp的方式最好(udpsrc插件)。如果需要分析N路视频,需要创建N个udpsrc,N个decoder,每路一个decoder,各自连接在一起,最终通过nvstreammux插件将这N条分支合并起来,再与推理插件连接。使用rtp的好处是:即插即用,与其他模块的耦合性低。一个系统中用于视频分析pipeline不可能独立存在,前面还需要给他推流的模块,而使用udp的方式接收rtp报文无疑是最方便的,哪路有数据哪路就开始工作,没数据的分支不影响有数据的分支。注意,如果有N路视频流,在用nvstreammux合并的时候,nvstreammux的 batched-push-timeout属性一定不能设置为-1,-1表示无限等待,必须等到每个分支都收到数据,如果这时候有一路没有视频流了(只有N-1路有数据),那么会无限等待,其他分支不能正常工作。可以设置一个合理的值,比如40000(40ms),过了这个时间如果某个分支没有数据,等待40ms之后就不会再等了。

(3)动态删除/添加/替换Pipeline中的插件非常麻烦,实际应用中,比如需要给某路视频录像,由于录像是有时间限制的,因此不可能一直使用filesink,当时间到了,我们需要将录像用到的filesink替换成fakesink,这个替换过程很复杂:先需要在filesink的上一个插件的src-pad上添加一个block 的probe,然后在这个probe中编写代码将filesink remove掉,创建新的fakesink,然后将fakesink连在原来filesink的位置,最后返回GST_PAD_PROBE_REMOVE,表示将block probe移除,整个流程结束。反过来,当需要录像时,一样需要添加一个block probe,然后在这个probe中将filesink加上去,开始录像。

(4)目标跟踪优先使用KLT算法,但是这个算法特别吃CPU,所以如果影响到整个pipeline的性能了,比如FPS变小了,可以切换到IOU,IOU的跟踪效果不如KLT,但是还凑合,关键还是检测模型要准,这样可以弥补一下IOU的缺陷。IOU相对而言对CPU依赖更小。

(5)在使用udpsrc接收其他模块发来的rtp数据时,由于其他模块可能出现故障会重启,重启后接着发送rtp数据,这时候pipeline中的rtph264depay可能会抛出NAL unit type 26 not supported的异常,这是因为之前piepline中可能有残留数据,导致depay失败。对于这个error,我们在bus_callback中捕获之后,不需要做任何处理,千万不要delete整个pipeline再recreate,这样会导致内存泄漏(至今没找到什么原因),最后越来越卡,FPS越来越小。

未完待续

[AI开发]DeepStream开发填坑记录的更多相关文章

  1. 微信小程序开发技巧及填坑记录

    以下是自己在开发过程中遇到的坑和小技巧,记录以下: 1.出现了 page[pages/XXX/XXX] not found.May be caused by :1. Forgot to add pag ...

  2. webapp填坑记录[更新中]

    网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...

  3. webapp填坑记录

    网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...

  4. Phoenix踩坑填坑记录

    Phoenix踩坑填坑记录 Phoenix建表语句 如何添加二级索引 判断某表是否存在 判断索引是否存在 Date类型日期,条件判断 杂项 记录Phoenix开发过程中的填坑记录. 部分原文地址:ph ...

  5. Kafka踩坑填坑记录

    Kafka踩坑填坑记录 一.kafka通过Java客户端,消费者无法接收消息,生产者发送失败消息 二. 一.kafka通过Java客户端,消费者无法接收消息,生产者发送失败消息 在虚拟机上,搭建了3台 ...

  6. Linux踩坑填坑记录

    Linux踩坑填坑记录 yum安装失败[Errno 14] PYCURL ERROR 6 - "Couldn't resolve host 'mirrors.aliyun.com'" ...

  7. Android—基于微信开放平台v3SDK,开发微信支付填坑。

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...

  8. 微信小程序发送红包功能。填坑记录

    微信官方文档 1.开通条件 (1)商户号已入驻90日 (2)商户号有连续30天正常交易 (3)只有企业资质的商户才有资格申请 2.注意事项 (1)目前小程序红包仅支持用户微信扫码打开小程序 (2)小程 ...

  9. MVC5项目转.Net Core 2.2学习与填坑记录(1)

    流程都是自己摸索,错误地方随便指正... 老项目过于臃肿,并且所有请求都是提交到一个api中,这样当api挂掉的时候,基本所有的项目都瘫痪掉了. 在4月底的时候,下决心将项目用微服务进行重写,刚开始的 ...

  10. F2eTest和uirecorder自动化测试环境部署填坑记录

    坑1:尝试部署的时候只在opennode.bat里面填写了两个浏览器,测试通过后再增加其他浏览器,页面上一直不显示. 填坑:需要清空数据库里的`wd_browsers`和`wd_nodes`表,然后重 ...

随机推荐

  1. 01 jQuery配置、jQuery语法结构、jQuery对象与DOM对象的互相转换

    配置jQuery环境 下载jQuery    官网:jquery.com 学习或开发建议选择未压缩版,便于学习,发布建议选择压缩版,便于用户极速体验(点击下载若出现的是代码页 面,Ctrl+A全选复制 ...

  2. 【Android - 自定义View】之MeasureSpec简介

    MeasureSpec是View测量过程中的一个重要的类,它被用来将View的尺寸规格(SpecSize)和尺寸模式(SpecMode)封装在一起,并提供打包和解包的方法. MeasureSpec虽然 ...

  3. 线程池&进程池

    线程池&进程池 池子解决什么问题? 1.创建/销毁线程伴随着系统开销,如果过于频繁会影响系统运行效率 2.线程并发数量过多,抢占系统资源,从而导致系统阻塞甚至死机 3.能够刚好的控制和管理池子 ...

  4. git的用法 回到某个版本

    进入到项目文件夹 如果新建项目时没有勾选git 进入到项目中

  5. 第四章 开始Unity Shader学习之旅(1)

    1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity ...

  6. zz:NETCONF协议详解

    随着SDN的大热,一个诞生了十年之久的协议焕发了第二春,它就是NETCONF协议.如果你在两年前去搜索NETCONF协议,基本得到的信息都是"这个协议是一个网管协议,主要目的是弥补SNMP协 ...

  7. 转:Eclipse中创建Maven版的Web工程(详解)

    一.搭建步骤 ♦首先创建一个Maven的Project,如下图: ♦点击Next,勾选 Create a simple project ♦点击Next,注意Packing要选择war,因为我们创建的是 ...

  8. iOS开发经常用到的国外网站,让我们接轨国外的最新技术吧!

    转自:http://www.bubuko.com/infodetail-787949.html 工欲善其事必先利其器,最近发现临时查找一些东西容易浪费时间,花了点时间整理一下常用的网站,方便以后备用. ...

  9. [TimLinux] Django 中间件

    1. 定义 中间件是一个钩子框架,深入到django的请求/响应处理过程中.这是一个轻量.底层插件系统,目的是全局修改django的输入或输出.每一个中间件组件都是用来处理特定的功能.例如django ...

  10. Oracle - 给rac创建单实例dg,并做主从切换

    一.概述 本文将介绍如何给rac搭建单节点的dg,以及如何对其进行角色转换.预先具备的知识(rac搭建,单实例-单实例dg搭建) 二.实验环境介绍 主库rac(已安装rac,并已有数据库orcl)ra ...