jetson deepstream 解码接入编码输出

2024-01-07 20:40:04

不需要编解码输出画面的直接到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 cv2

def 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流

文章来源:https://blog.csdn.net/qianbo042311/article/details/135425419
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。