下面是在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. HDFS原理概念扫盲

    1.概述 hdfs文件系统主要设计为了存储大文件的文件系统:如果有个TB级别的文件,我们该怎么存储呢?分布式文件系统未出现的时候,一个文件只能存储在个服务器上,可想而知,单个服务器根本就存储不了这么大 ...

  2. MySQL双主+keepalived实现高可用实现(热备)

    环境:centos6.7 最小化安装 192.168.100.152 master 主192.168.100.153 slave 从192.168.100.132 v_ip 浮动IP 配置ssh密码登 ...

  3. CCNA 之 十 ACL 访问控制列表

    ACL 访问控制列表 ACL(Access Control List) 接入控制列表 ACL 的量大主要功能: 流量控制 匹配感兴趣流量 标准访问控制列表 只能根据源地址做过滤 针对曾哥协议采取相关动 ...

  4. 我是怎样测试Java类的线程安全性的

    线程安全性是Java等语言/平台中类的一个重要标准,在Java中,我们经常在线程之间共享对象.由于缺乏线程安全性而导致的问题很难调试,因为它们是偶发的,而且几乎不可能有目的地重现.如何测试对象以确保它 ...

  5. Python中的UDP协议应用之飞秋应用-单IP版本

    UDP协议是无连接的.不稳定的网络通信协议. 通过使用飞秋端口(2425),以及模拟飞秋消息格式实现使用UDP协议对飞秋进行通信. 飞秋通信格式: '1:1000:66:%s:32:%s' 以冒号分割 ...

  6. 编译原理 算法3.8 LR分析 c++11实现

    LR分析简介 LR分析是应用最广泛的一类分析方法,它是实用的编译器功能中最强的分析器,其特点是: 1,采用最一般的无回溯移进-规约方法. 2,可分析的文法是LL文法的真超集. 3,能够及时发现错误,及 ...

  7. 简单http和https服务器python脚本

    欢迎加入python学习交流群 667279387 工作经常要用到测试http和https协议,这里写了两个简单的脚本实现简单的http服务器和https服务器. http服务器代码 import s ...

  8. go学习第三天、数据类型

    基本数据类型 bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte // alias ...

  9. 牛客剑指offer(持续更新~)

    第一题:二维数组的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...

  10. ThreadLocal解决了什么问题

    小明所在的项目组(迭代组:一直在迭代的路上),经常会在已有接口的基础上开发一些小功能,并且前提是在保证现有用户的不受影响基础上迭代.功能迭代,在代码层面小明有1w种实现方法(吹牛的),一起来看看这次小 ...