Jetson Nano 2GB系列文章(19):Utils的videoOutput工具

上一篇文章为大家深入地讲解了videoSource()这个非常强大的输入源处理模块,本文的重点将聚焦在videoOutput()这个输出标的处理模块。

上一篇文章为大家深入地讲解了videoSource()这个非常强大的输入源处理模块,本文的重点将聚焦在videoOutput()这个输出标的处理模块。

videoOutput()videoSource()几乎具备一致的特性。这里直接列出了videoOutput()所支持的输出种类与媒体格式:

  • 支持5种输出方式:
  • 显示器:“display://0”
  • RTP视频流:“rtp://<remote_ip>:1234”
  • 视频文件:完整文件名,例如 “input.mp4”
  • 图像文件:完整文件名,例如 “room_0.jpg”
  • 文件夹:完整文件夹路径当识别到输出类型为文件夹时,就会按照流水号递增方式生成文件名

 

  • 支持4种视频输出格式:MKVMP4AVIFLV
  • 支持5种媒体输出格式:H.264 H.265VP8VP9MJPEG
  • 支持4种图像格式:JPGPNGTGABMP
  • 自动根据数据源,调用合适的NVDEC解码功能
  • 调用CUDA核处理大部分基础图像处理任务

 

我们在前面已经熟悉了将结果输出到显示器上的方式,接下来就来体验其他几种输出方式,这对于将来开发边缘应用是非常有帮助的。要知道绝大部分的边缘计算场景,都是不能在设备上直接连上显示器的,那么此时如何观看该设备上所监控到的视频内容呢?通常就是将输入源所获取的数据,做完深度学习推理识别之后的结果,做以下两种处理方式:

 

  • 在当地存成视频,然后批次往管理服务区发送,再删除该视频,以保留空间。
  • 将视频流直接转向到其他设备上进行显示。

 

至于使用哪种方式,必须根据实际场景而定。而本文的重点就是带着大家,对这两种用法进行试验,并借此学会这些使用方法。

 

我们还是用10lines.py代码为基础来进行修改,不过为了节省测试时间,这里会将深度学习推理计算的部分省略掉,只保留videoSource()videoOutput()这两部分的代码。修改后的内容如下:

 

import jetson.utils

input  = jetson.utils.videoSource(INPUT)

output = jetson.utils.videoOutput(OUTPUT)

 

while output.IsStreaming():

       img = input.Capture()

       output.Render(img)

 

这个6行代码,让人看起来非常轻松,却又支持了绝大部分常用的输入、输出形态与格式。

 

接下来的重点,就是将代码内的INPUTOUTPUT做有效的置换,试试以下几种组合状况:

 

Jetson Nano 2GB系列文章(19):Utils的videoOutput工具

  • CSI摄像头读入,然后输出存放至csi.mp4视频文件,这个相对直观,因此不多做说明。在观察jetson-stats时,若输出为视频文件,NVENC编码器的功能就启动了。

Jetson Nano 2GB系列文章(19):Utils的videoOutput工具

  • VisionWorks的范例视频signs.avi作为输入,输出成个别侦图像到output目录里。视频长度为22秒,输出后生成44张图像,就是每0.5秒生成一张图像,不过实际生成的数量并不一定,与其他相关参数也有关。
  • 这个组合是本文的重点实验,因为RTP视频流转向的实用性非常高,操作较为复杂,必须在发送端与接收端之间进行配合,因此需要花点时间说明并演示。

接下来就进行RTP视频流转向的示范步骤:

  • 设备:一台Jetson Nano担任发送端,另外需要一台设备执行接受端,这个可以是另一台Jetson设备,也可以是WindowsMACUbuntu操作系统的x86电脑。
  • 网络:本实验的发送端与接收端设备,都在内网中的同一个网段。这里的实验用MicroUSB线连接Jetson Nano 2GB与运行Ubuntu操作系统的x86电脑,此时Jetson NanoIP192.168.55.1x86电脑的IP192.168.55.100,因此就需要将代码中OUTPUT部分修改成“rtp://192.168.55.100:1234”,修改后的完整代码如下:

 

import jetson.utils

input  = jetson.utils.videoSource(“/dev/video0”)

output = jetson.utils.videoOutput(“rtp://192.168.55.100:1234”)

 

# import jetson.inference

# net = jetson.inference.detectNet("ssd-mobilenet-v2", threshold=0.5)

 

while output.IsStreaming():

       img = input.Capture()

#     detections = net.Detect(img)

       output.Render(img)

  • 执行步骤:
  • 在发送端上执行以下指令:

1

  • python3 10lines.py

执行过程中会出现如下截屏的摄像头信息内容:

Jetson Nano 2GB系列文章(19):Utils的videoOutput工具

最后停在下面截屏的地方,发送端到这边就不用再去动这个指令框了。Jetson Nano 2GB系列文章(19):Utils的videoOutput工具

  • 在接收端执行接收的动作:
    • Ubuntu操作系统下,可执行以下指令便能直接接收视频流:

1

  • gst-launch-1.0 -v udpsrc port=1234 caps = "application/x-rtp, \ media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, \ payload=(int)96" ! rtph264depay ! decodebin ! videoconvert ! autovideosink

 

正确执行指令后,接收端设备的命令行会停留在如下图的状态:

 

Jetson Nano 2GB系列文章(19):Utils的videoOutput工具

 

并且还会跳出一个显示框,核对以下显示的内容与Jetson Nano上的摄像头是否一致。

Jetson Nano 2GB系列文章(19):Utils的videoOutput工具

发送端与接收端之间的显示,是否出现时间差?取决于网络的质量!

 

    • VLC播放软件,适用于WindowsMacUbuntu操作系统:

首先得在接收设备上安装VLC播放软件,然后用文字编辑器生成一个”.sdp”文件,例如”rdp.sdp”,里面的内容如下:

 

ic=IN IP4 127.0.0.1

m=video 1234 RTP/AVP 96

a=rtpmap:96 H264/90000

 

同样先在发送端执行10lines.py这个代码,然后在接收端用VLC播放器打开rdp.sdp,就可以在VLC播放器上显示了。

 

 

Jetson Nano 2GB系列文章(19):Utils的videoOutput工具

这样就能很轻松地将Jetson Nano 2GB上的摄像头看到的画面,直接透过RTP转到PC上去呈现。

这时候,如果你打开Jetson Nano 2GBjetson-stats监控软件,也会看的左下角“NVDEC”处于执行的状态。

如果我们这时候将物件检测的推理识别功能打开的话,会出现怎样的结果呢?先将前面代码中的”#”部分取消,开启对象检测的功能,执行一次看看就知道,是否如下图一样会出现检测的结果。

 

Jetson Nano 2GB系列文章(19):Utils的videoOutput工具

好的,到这里为止,是不是已经可以更好地掌握videoOutput()的一些用法了呢?

来源:业界供稿

0赞

好文章,需要你的鼓励

2021

06/01

09:45

分享

点赞

邮件订阅
白皮书