jetson deepstream 解码接入编码输出

2024-01-06 22:44

本文主要是介绍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流

这篇关于jetson deepstream 解码接入编码输出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/577859

相关文章

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

IDEA接入Deepseek的图文教程

《IDEA接入Deepseek的图文教程》在本篇文章中,我们将详细介绍如何在JetBrainsIDEA中使用Continue插件接入DeepSeek,让你的AI编程助手更智能,提高开发效率,感兴趣的小... 目录一、前置准备二、安装 Continue 插件三、配置 Continue 连接 DeepSeek四

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首