[AI开发]DeepStream开发填坑记录
下面是在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.出现了 page[pages/XXX/XXX] not found.May be caused by :1. Forgot to add pag ...
- webapp填坑记录[更新中]
网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...
- webapp填坑记录
网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...
- Phoenix踩坑填坑记录
Phoenix踩坑填坑记录 Phoenix建表语句 如何添加二级索引 判断某表是否存在 判断索引是否存在 Date类型日期,条件判断 杂项 记录Phoenix开发过程中的填坑记录. 部分原文地址:ph ...
- Kafka踩坑填坑记录
Kafka踩坑填坑记录 一.kafka通过Java客户端,消费者无法接收消息,生产者发送失败消息 二. 一.kafka通过Java客户端,消费者无法接收消息,生产者发送失败消息 在虚拟机上,搭建了3台 ...
- Linux踩坑填坑记录
Linux踩坑填坑记录 yum安装失败[Errno 14] PYCURL ERROR 6 - "Couldn't resolve host 'mirrors.aliyun.com'" ...
- Android—基于微信开放平台v3SDK,开发微信支付填坑。
接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...
- 微信小程序发送红包功能。填坑记录
微信官方文档 1.开通条件 (1)商户号已入驻90日 (2)商户号有连续30天正常交易 (3)只有企业资质的商户才有资格申请 2.注意事项 (1)目前小程序红包仅支持用户微信扫码打开小程序 (2)小程 ...
- MVC5项目转.Net Core 2.2学习与填坑记录(1)
流程都是自己摸索,错误地方随便指正... 老项目过于臃肿,并且所有请求都是提交到一个api中,这样当api挂掉的时候,基本所有的项目都瘫痪掉了. 在4月底的时候,下决心将项目用微服务进行重写,刚开始的 ...
- F2eTest和uirecorder自动化测试环境部署填坑记录
坑1:尝试部署的时候只在opennode.bat里面填写了两个浏览器,测试通过后再增加其他浏览器,页面上一直不显示. 填坑:需要清空数据库里的`wd_browsers`和`wd_nodes`表,然后重 ...
随机推荐
- MySQL双主+keepalived实现高可用实现(热备)
环境:centos6.7 最小化安装 192.168.100.152 master 主192.168.100.153 slave 从192.168.100.132 v_ip 浮动IP 配置ssh密码登 ...
- python基本文件操作
python文件操作 python的文件操作相对于java复杂的IO流简单了好多,只要关心文件的读和写就行了 基本的文件操作 要注意的是,当不存在某路径的文件时,w,a模式会自动新建此文件夹,当读模式 ...
- Socket模拟SSH
Socket模拟SSH 主要思路 客户端发送相关命令到服务端,服务端执行命令(通过subprocess模块实现)然后将结果返回给客户端 小知识 Linux中可以发送空数据,服务端能接受到空数据 win ...
- Logos讲解--逆向开发
前言 Logos是CydiaSubstruct框架中提供的一组宏定义.利于开发者使用宏进行Hook操作,其语法简单,功能是非常强大且稳定. 详细内容logos语法为http://iphonedevwi ...
- php方法注释
注释格式 <?php /** * @method 发送邮件 * @url email/send?token=xxx * @http POST * @param token string [必填] ...
- 基于netty4.x开发时间服务器
在写代码之前 先了解下Reactor模型: Reactor单线程模型就是指所有的IO操作都在同一个NIO线程上面完成的,也就是IO处理线程是单线程的.NIO线程的职责是: (1)作为NIO服务端,接收 ...
- 带着canvas去流浪系列之五 绘制K线图
[摘要] 用canvas原生API实现百度Echarts 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...
- 如何对IP地址进行子网划分?
在网络行业,子网划分是必须掌握的的基础知识点,下图是IP地址分类: 子网划分主要掌握的是划分思路,接下来我以192.168.1.72/27的IP划分做为例子: CIDR:无类域间路由. 可以看出192 ...
- luogu P1908 逆序对 |树状数组
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为"逆序对"的 ...
- Docker系列之MySQL安装教程
Docker系列之MySQL安装教程 有了前面的基础教程Docker系列之常用命令操作手册之后,本博客记录一篇mysql的安装教程 mysql镜像查询命令 docker search mysql 几个 ...