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