12

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

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

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

  1. 支持 5 种输出方式:
    显示器:“display://0”
    RTP 视频流:“rtp://<remote_ip>:1234”
    视频文件:“完整文件名”,例如 “input.mp4”
    图像文件:“完整文件名”,例如 “room_0.jpg”
    文件夹:“完整文件夹路径”,当识别到输出类型为“文件夹”时,就会按照流水号递增方式生成文件名
  2. 支持 4 种视频输出格式:MKV、MP4、AVI 与 FLV
  3. 支持 5 种媒体输出格式:H.264、H.265、VP8、VP9 与 MJPEG
  4. 支持 4 种图像格式:JPG、PNG、TGA 与 BMP
  5. 自动根据数据源,调用合适的 NVDEC 解码功能
  6. 调用 CUDA 核处理大部分基础图像处理任务

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

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

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

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

1.png

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

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

2.png

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

3.png

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

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

设备:一台 Jetson Nano 担任 “发送端”,另外需要一台设备执行 “接受端”,这个可以是另一台Jetson设备,也可以是 Windows、MAC 或 Ubuntu 操作系统的 x86电脑。

网络:本实验的发送端与接收端设备,都在内网中的同一个网段。这里的实验用 MicroUSB 线连接 Jetson Nano 2GB 与运行 Ubuntu 操作系统的 x86 电脑,此时Jetson Nano 的 IP 是 192.168.55.1,x86 电脑的 IP 是192.168.55.100,因此就需要将代码中 OUTPUT 部分修改成 “rtp://192.168.55.100:1234”,修改后的完整代码如下:

4.png

执行步骤:

  1. 在发送端上执行以下指令:

5.png

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

6.png

最后停在下面截屏的地方,发送端到这边就不用再去动这个指令框了。

7.png

  1. 在接收端执行接收的动作:

(1) 在 Ubuntu 操作系统下,可执行以下指令便能直接接收视频流:

8.png

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

9.png

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

10.png

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

(2) 用 VLC 播放软件,适用于 Windows、Mac、Ubuntu 操作系统:

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

11.png

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

12.png

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

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

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

13.png

推荐阅读
关注数
7021
内容数
61
深耕嵌入式 AI 计算,助力自主机器研发
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息