上一篇文章为大家深入地讲解了 videoSource() 这个非常强大的输入源处理模块,本文的重点将聚焦在 videoOutput() 这个输出标的处理模块。
videoOutput() 与 videoSource() 几乎具备一致的特性。这里直接列出了 videoOutput() 所支持的输出种类与媒体格式:
- 支持 5 种输出方式:
显示器:“display://0”
RTP 视频流:“rtp://<remote_ip>:1234”
视频文件:“完整文件名”,例如 “input.mp4”
图像文件:“完整文件名”,例如 “room_0.jpg”
文件夹:“完整文件夹路径”,当识别到输出类型为“文件夹”时,就会按照流水号递增方式生成文件名 - 支持 4 种视频输出格式:MKV、MP4、AVI 与 FLV
- 支持 5 种媒体输出格式:H.264、H.265、VP8、VP9 与 MJPEG
- 支持 4 种图像格式:JPG、PNG、TGA 与 BMP
- 自动根据数据源,调用合适的 NVDEC 解码功能
- 调用 CUDA 核处理大部分基础图像处理任务
我们在前面已经熟悉了将结果输出到显示器上的方式,接下来就来体验其他几种输出方式,这对于将来开发边缘应用是非常有帮助的。要知道绝大部分的边缘计算场景,都是不能在设备上直接连上显示器的,那么此时如何观看该设备上所监控到的视频内容呢?通常就是将输入源所获取的数据,做完深度学习推理识别之后的结果,做以下两种处理方式:
- 在当地存成视频,然后批次往管理服务区发送,再删除该视频,以保留空间。
- 将视频流直接转向到其他设备上进行显示。
至于使用哪种方式,必须根据实际场景而定。而本文的重点就是带着大家,对这两种用法进行试验,并借此学会这些使用方法。
我们还是用 10lines.py 代码为基础来进行修改,不过为了节省测试时间,这里会将深度学习推理计算的部分省略掉,只保留 videoSource() 与 videoOutput() 这两部分的代码。修改后的内容如下:
这个 6 行代码,让人看起来非常轻松,却又支持了绝大部分常用的输入、输出形态与格式。
接下来的重点,就是将代码内的 INPUT 与 OUTPUT 做有效的置换,试试以下几种组合状况:
- 从 CSI 摄像头读入,然后输出存放至 csi.mp4 视频文件,这个相对直观,因此不多做说明。在观察 jetson-stats 时,若输出为视频文件,NVENC 编码器的功能就启动了。
- 用 VisionWorks 的范例视频 signs.avi 作为输入,输出成个别帧图像到 OUTPUT 目录里。视频长度为 22 秒,输出后生成 44 张图像,就是每 0.5 秒生成一张图像,不过实际生成的数量并不一定,与其他相关参数也有关。
- 这个组合是本文的重点实验,因为 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”,修改后的完整代码如下:
执行步骤:
- 在发送端上执行以下指令:
执行过程中会出现如下截屏的摄像头信息内容:
最后停在下面截屏的地方,发送端到这边就不用再去动这个指令框了。
- 在接收端执行接收的动作:
(1) 在 Ubuntu 操作系统下,可执行以下指令便能直接接收视频流:
正确执行指令后,接收端设备的命令行会停留在如下图的状态:
并且还会跳出一个显示框,需要核对一下显示的内容与 Jetson Nano 上的摄像头是否一致。
发送端与接收端之间的显示,是否出现时间差?取决于网络的质量!
(2) 用 VLC 播放软件,适用于 Windows、Mac、Ubuntu 操作系统:
首先得在接收设备上安装 VLC 播放软件,然后用文字编辑器生成一个 “.sdp” 文件,例如 “rdp.sdp”,里面的内容如下:
同样先在发送端执行 10lines.py 这个代码,然后在接收端用 VLC 播放器打开 rdp.sdp,就可以在 VLC 播放器上显示了。
这样就能很轻松地将 Jetson Nano 2GB 上的摄像头看到的画面,直接透过 RTP 转到 PC 上去呈现。
这时候,如果你打开 Jetson Nano 2GB 的 jetson-stats 监控软件,也会看到左下角“NVDEC”处于执行的状态。
如果我们这时候将 “物件检测” 的推理识别功能打开的话,会出现怎样的结果呢?先将前面代码中的 “#” 部分取消,开启对象检测的功能,执行一次看看就知道,是否如下图一样会出现检测的结果。