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.hqwc.cn/news/326248.html

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

相关文章

【Linux软件包管理器】yum详解

目录 1、什么是软件包 2、yum的操作 1)yum源 2)三板斧 ① yum list ② yum install [软键名] ③ yum remove [软件名] 1、什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了,…

【Bootstrap学习 day11】

Bootstrap5字体图标 字体图标是在Web项目中使用的图标字体。 使用字体图标的好处是,可以通过应用CSS color属性来创建任何颜色的图标。此外,要更改图标的大小,只需使用CSS font-size属性即可。 获取字体图标 在网页中包含Bootstrap5图标的最…

关于优质乳制品的不可忽视的关键

关于优质乳制品的不可忽视的关键 奶源是乳制品生产中至关重要的一环。无论是牛奶、酸奶、乳酪还是黄油,它们的品质和口感都与奶源密不可分。因此,羊大师发现了解奶源的重要性,对于生产商、消费者乃至整个乳制品行业来说,都至关重…

kubernetes(k8s)集群常用指令

基础控制指令 # 查看对应资源: 状态 $ kubectl get <SOURCE_NAME> -n <NAMESPACE> -o wide 查看默认命名空间的pod [rootk8s-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 3h53m查看所有pod [roo…

MySQL-DDL

DDL是数据定义语言&#xff0c;用来定义数据对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09; 数据库操作&#xff1a; 1.查询&#xff1a; 查询所有数据库&#xff1a;SHOW DATABASES; 查询当前数据库&#xff1a;SELECT DATABASE(); 2.创建&#xff1a; C…

【python入门】day20:学生信息管理系统CRUD,排序模块和项目打包中的业务流程、具体实现

CRUD&#xff0c;每个程序员都必须掌握的 录入C create def save(lst):#保存信息try: #保存成绩时有可能出错&#xff0c;所以使用try-exceptstu_txtopen(filename,a,encodingutf-8)#filename是个变量&#xff0c;所以不用写单引号#文件以追加模式打开#怕中文乱码&…

C++异常处理机制

文章目录 C语言传统的处理错误的方式C异常概念异常的使用自定义异常体系C标准库的异常体系异常的优缺点 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击…

eureka注册列表 某服务出现多个服务实例

最近文件导出功能偶发成功&#xff0c;大部分情况都失败&#xff0c;开始以为接口被拦截&#xff0c;gateway服务没有接口调用日志&#xff0c;发现测试环境可以&#xff0c;正式环境功能无法正常使用。 偶然看到注册中心如下 发现file服务有3个实例&#xff0c;调用接口将错误…

Jmeter 性能 —— 电商系统TPS计算!

1、怎么计算得出TPS指标 ①第一个通过运维那边给的生产数据&#xff0c;看一下生产进件有多少&#xff0c;计算得来的&#xff0c;如果没有生产数据&#xff0c;或者不过就看如下的方法 ②第二个就是根据最近一个月的实际访问数据&#xff0c;比如每天调用了多少个接口&#…

【机器学习:欧氏距离 】机器学习中欧氏距离的理解和应用

【机器学习&#xff1a;欧氏距离 】机器学习中欧氏距离的理解和应用 距离公式二维更高的维度点以外的物体属性欧几里得距离的平方概括历史 在数学中&#xff0c;欧氏距离’是指欧氏空间中任意两点之间的直线距离。这种距离可以通过应用勾股定理来计算&#xff0c;利用两点的笛卡…

Filter Options in Select Field

Filter Options in Select Field 假设有两个下拉字段State和City。邦有两个值卡纳塔克邦和马哈拉施特拉邦&#xff0c;城市有四个值&#xff0c;班加罗尔&#xff0c;迈索尔&#xff0c;孟买和浦那。如果希望根据State中选择的值过滤City中的选项&#xff0c;可以编写如下所示的…

LeetCode 每日一题 Day 32 ||递归单调栈

2487. 从链表中移除节点 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输入&#xff1a;head [5,2,13,3,8] 输出&#xff1a;[13,8] 解释&#xff1a;需要移除的节点是 5 &#xff0c;2 和 3 。…