jetson deepstream 解码接入编码输出

不需要编解码输出画面的直接到7 使用就行

1 jetson主板编译工具

在jetson主板上安装gstreamer工具链,编译opencv

sudo apt install -y libgstreamer1.0-dev 
libgstreamer-plugins-base1.0-dev 
gstreamer1.0-plugins-ugly 
gstreamer1.0-rtsp python3-dev python3-numpy
git clone --depth=1 -b 4.6.0 https://github.com/opencv/opencv
cd opencv
mkdir build && cd build
cmake -D CMAKE_INSTALL_PREFIX=/usr -D WITH_GSTREAMER=ON ..
make -j4
sudo make install

上面的opencv 肯定是少编译了很多东西,尤其是cuda的编译,需要大家自己去写参数编译,jetson上编译挺费时间的,耐心做就行了

2 解码输入

如rtsp接入,文件接入

videoSource = "filesrc location=\"" + addressIn + "\" ! qtdemux ! queue ! h264parse ! nvh264dec ! cudadownload ! appsink";

import sys
import cv2def read_cam():cap = cv2.VideoCapture("filesrc location=/home/nvidia/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! video/x-raw,format=BGR ! appsink  ")w = cap.get(cv2.CAP_PROP_FRAME_WIDTH)h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)fps = cap.get(cv2.CAP_PROP_FPS)print('Src opened, %dx%d @ %d fps' % (w, h, fps))

如果是rtsp接入,这么写就行了,下面是c++ 示例,python一样没有区别

std::string pipe = "rtspsrc location=rtsp://xxxxxxxxxxxx/ ! rtph265depay ! h265parse ! nvv4l2decoder ! nvvidconv ! video/x-raw, width=(int)640, height=(int)384, format=(string)BGRx ! videoconvert ! appsink";
cv::VideoCapture cap(pipe, cv::CAP_GSTREAMER);

3 硬件编码输出

下图是编码能力
在这里插入图片描述

由于在gpu中,四字节对齐,所以是RGBA 或者 BGRA,所以输入编码器要转换一次,否则颜色是不正确的,nvvidconv 也可以为nvvideoconvert,输出rtsp,则要改写成rtspclientsink,另外假设好rtsp服务器,这里的rtsp服务要有接收推流的rtsp服务。

    gst_out = "appsrc ! video/x-raw, format=BGR ! queue ! videoconvert ! video/x-raw,format=BGRx ! nvvidconv ! nvv4l2h264enc ! h264parse ! matroskamux ! filesink location=test.mkv "out = cv2.VideoWriter(gst_out, cv2.CAP_GSTREAMER, 0, float(fps), (int(w), int(h)))if not out.isOpened():print("Failed to open output")exit()if cap.isOpened():while True:ret_val, img = cap.read();if not ret_val:break;out.write(img);cv2.waitKey(1)else:print "pipeline open failed"print("successfully exit")cap.release()out.release()

4 udp rtp输出

pipe = cv::VideoWriter("appsrc ! video/x-raw, format=BGR ! queue ! videoconvert ! video/x-raw, format=BGRx ! nvvidconv \
! nvv4l2h264enc maxperf-enable=1 \
! rtph264pay pt=96 config-interval=1 ! application/x-rtp, media=video, encoding-name=H264 , profile=main\
! udpsink host=localhost port=5000", 0, 30, cv::Size (w, h));

5 解码到编码流程的效率问题

需要解决的是直接输入到gpumat中
camera → gpu → opencv → cpu → opencv → gpu → encode → upd → stream
需要改成
camera → gpu → opencv → encode → upd → stream
才能加快速度,因为从gpu中download到cpu中速度是比较慢的,当然,仔细想想不难发现,一定是要download到cpu中的,否则怎么可能通过网络发送到其他host呢,不过是少了一次从gpu 到 cpu的过程,过程就是使用所有的gpu函数,gpu下载到cpu只经历一次,从而来提高效率
我会试一下

str = "filesrc location=/xx.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! nvvidconv ! video/x-raw, format=BGRx ! appsink"

是不是能直接到gpumat中.试过以后再过来写

不过直接使用cuda,ffmpeg其实在opencv中是可以做到的,我上一篇文章已经写过了,不过在jetson中的板子是无法使用ffmpeg直接硬件解码的,无法直接挂钩到gpumat中,所以还是多使用使用这种方案。

6 没有编码引擎的问题

jetson 主板上如果没有硬件编码,那只能使用软件编码,速度奇慢,我一开始认为所有的jetson上的板子应该有硬件编码,结果有的就是没有,并不是没有算力或者gpu加速,有gpu加速,但是没有硬件编码的引擎是存在这种情况的。

   std::string pvw ="appsrc ""! video/x-raw, format=BGR ""! videoconvert ""! video/x-raw, format=I420 ""! nvvidconv ""! x264enc ! rtspclientsink location=rtsp://192.168.0.135:8554/123"; video_writer_.open(pvw, cv::CAP_GSTREAMER, 0, fps, size);

在这里插入图片描述
这就编码成功发送,服务器正常接收到流,使用vlc可以播放了。

7 使用deepstream

使用deepstream在jetson板子上比较简单,首先确定自己的安装,gstreamer是必然要的,刚才已经编译了opencv等工具,可以再检查一次,输入以下命令
1 jtop 查看
2 dpkt -l grep TensorRT
3 deepstream-app --version-all

jetson development kit ,一般都包含了 TensorRT and cuDNN.这些我们已经不需要安装了。

看看自己是否已经安装deepstream,没有安装,按照以下官方文档进行被指导安装
https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Quickstart.html

$ sudo apt install
libssl3
libssl-dev
libgstreamer1.0-0
gstreamer1.0-tools
gstreamer1.0-plugins-good
gstreamer1.0-plugins-bad
gstreamer1.0-plugins-ugly
gstreamer1.0-libav
libgstreamer-plugins-base1.0-dev
libgstrtspserver-1.0-0
libjansson4
libyaml-cpp-dev

安装kafka通信组件
$ git clone https://github.com/confluentinc/librdkafka.git
$ cd librdkafka
$ git checkout tags/v2.2.0
$ ./configure --enable-ssl
$ make
$ sudo make install
拷贝以下到目录中
$ sudo mkdir -p /opt/nvidia/deepstream/deepstream-6.4/lib
$ sudo cp /usr/local/lib/librdkafka* /opt/nvidia/deepstream/deepstream-6.4/lib
$ sudo ldconfig

从地址下载包
https://catalog.ngc.nvidia.com/orgs/nvidia/resources/deepstream
安装包
$ sudo apt-get install ./deepstream-6.4_6.4.0-1_arm64.deb

运行例子程序
$ cd /opt/nvidia/deepstream/deepstream-5.1/samples/configs/deepstream-app/
$ deepstream-app -c source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt

8 转编码到rtsp输出

将deepstream的输出到外部rtsp,直接使用修改python文件的方法,将输出的图像按照1-6 的方式输出到rtsp流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全与认证Week3 Tutorial+历年题补充

目录 1) 什么是重放攻击? 2)什么是Kerberos系统?它提供什么安全服务? 3)服务器验证客户端身份的一种简单方法是要求提供密码。在Kerberos中不使用这种身份验证,为什么?Kerberos如何对服务器和客户机进行身份验证? 4) Kerberos的四个要求是什么?Kerberos系…

C++日期类的实现

前言:在类和对象比较熟悉的情况下,我们我们就可以开始制作日期表了,实现日期类所包含的知识点有构造函数,析构函数,函数重载,拷贝构造函数,运算符重载,const成员函数 1.日期类的加减…

JetBrains Rider使用总结

简介: JetBrains Rider 诞生于2016年,一款适配于游戏开发人员,是JetBrains旗下一款非常年轻的跨平台 .NET IDE。目前支持包括.NET 桌面应用、服务和库、Unity 和 Unreal Engine 游戏、Xamarin 、ASP.NET 和 ASP.NET Core web 等多种应用程序…

面试题--消失的两个数字(困难)

个人主页:Lei宝啊 愿所有美好如期而遇 目录 本题链接 输入描述 输出描述 算法分析 触类旁通一:消失的数字 题目分析 图示 解题源码 触类旁通二:只出现一次的数字III 题目分析 图示 解题源码 本题分析 解题源码 本题链接 力…

Linux第19步_安装“Ubutun交叉编译工具链”

由于Ubuntu系统使用的GCC编译器,编译结果是X86文件,只能在X86上运行,不能在ARM上直接运行。因此,还要安装一个“Ubutun交叉编译工具链”,才可以在ARM上运行。 arm-none-linux-gnueabi-gcc是 Codesourcery 公司&#x…

PHP语言B/S架构医院(安全)不良事件上报系统源码

医院安全(不良)事件上报系统采用无责的、自愿的填报不良事件方式,有效地减轻医护人员的思想压力,实现以事件为主要对象,可以自动、及时、实际地反应医院的安全、不良、近失事件的情况,更好地掌握不良事件的…

【Docker】docker 服务相关命令

目录 1. 启动docker 服务 2.查看docker 服务的状态 3. 停止docker 服务 4.重启 docker 服务 5.开机自启动命令 1. 启动docker 服务 systemctl start docker 2.查看docker 服务的状态 systemctl status docker 3. 停止docker 服务 systemctl stop docker 此时再使用 syst…

C++八股学习心得.5

1.基类 & 派生类 一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下: class derived-class: acce…

网络摄像机的网络连接

网络摄像机的网络连接 1. 网络连接2. 网络直通线和网络交叉线的制作方法References 1. 网络连接 网络摄像机完成安装后,需要进行功能的配置及参数的设置,您可以通过浏览器进行相关功能的配置。 有线网络连接 左侧为通过网络直通线连接的示意图&#x…

阿里云服务器Centos安装宝塔面板

阿里云服务器Centos安装宝塔面板 1 背景1.1 aliyun1.2 Linux 2 安装步骤2.0 环境配置2.1 安装前准备2.2 宝塔安装2.3 建站 3 centos常用命令3.1 防火墙相关 1 背景 1.1 aliyun 阿里云服务器是阿里云提供的一项云计算服务,它能够帮助用户快速搭建网站、应用和服务&…

模板模式实现分布式锁实战

前言 分布式锁相信大家都有用过,常见的分布式锁实现方式例如redis、zookeeper、数据库都可以实现,而我们代码中强引用这些分布式锁的代码,那么当我们以后想替换分布式锁的实现方式时,需要修改代码的成本会很高,于是我…

OpenCV图像处理|1.1 OpenCV介绍与环境搭建

1.1.1 介绍 OpenCV(Open Source Computer Vision Library)开放源代码计算机视觉库,主要算法涉及图像处理、计算机视觉和机器学习相关方法。OpenCV 其实就是一堆 C 和 C语言的源代码文件,这些源代码文件中实现了许多常用的计算机视…

安装PyTorch及环境配置(应用于Python上的YOLO)

这个基本都是Bilibili网站里面叫“小手丫子”up的视频教程,此前自己需要装了好几次又卸载了好几次,现在根据视频教学整理出来自己所理解的文档。 注意事项 1.安装的pycharm版本和anaconda版本无要求。 2.运行pycharm尽量以管理员身份运行。 3.Cuda是独…

AWTK 开源串口屏开发(5) - MCU端 SDK 用法

AWTK 开源智能串口屏,不但开放了串口屏端全部源码,还提供了MCU 端 SDK,大大加快 MCU 软件的开发。本介绍一下 MCU 端 SDK 在不同平台上的用法。 完整示例可以参考下面的几个例子: 普通嵌入式系统 mcu/stm32/hmi_app/hmi_app.c 低…

docker +gitee+ jenkins +maven项目 (二)

文章目录 前言一、创建Maven项目二、常规配置1.gitee配置2.gitee仓库配置3.构建时操作4.构建后操作 总结 前言 上一篇文章介绍了Jenkins的环境配置和工具配置,这篇进行具体maven项目的配置 一、创建Maven项目 二、常规配置 1.gitee配置 在工具哪里配置好gitee后&…

设计模式② :交给子类

文章目录 一、前言二、Template Method 模式1. 介绍2. 应用3. 总结 三、Factory Method 模式1. 介绍2. 应用3. 总结 参考内容 一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书&qu…

JMeter之测试WebService接口

JMeter之测试WebService接口 1 背景2 目的3 介绍4 具体操作4.1 soapUI调用4.2 JMeter工具调用4.3 操作步骤流程4.3 重点 1 背景 WebService应用的范围是非常广,任何需要跨平台、跨系统进行数据交换和功能调用的场景都可以用此来实现,在实际的工作中也常常…

Unity中Shader的_Time精度问题

文章目录 前言一、U方向上优化二、V方向上优化在这里插入图片描述 三、最终代码1、效果2、Shader 前言 在Unity的Shader中,使用了_Time来达到UV的流动效果,普遍会出现一个问题。我们的UV值会随着时间一直增加(uv值增加了,但是因为…

3元一平方公里的在线卫星影像

我们为大家分享了免费下载卫星影像的方法。 但让人遗憾的是,该影像的最高分辨率只有10米,需要更高清且比较新的卫星影像,看来还是得付费购买才比较靠谱。 自助选择区县范围 商业卫星影像主要面向企事业单位,一般来讲都比较贵&a…

Windows安装DolphinDB,配置单节点启动与GUI

1. 安装Java 首先,进入网址:jdk11 下载jdk-11.0.20_windows-x64_bin.exe,然后安装即可 安装完成后,打开命令提示符,输入: java javac如果这两个命令都出现一大堆东西,而不是找不到指令的提示的…