客户端应用 - 设备调用流程#

简介#

Jetson 平台服务包含一套微服务,每个微服务都提供用于配置和交互的 API。本节概述了移动应用程序使用的关键功能相关的调用流程。它为希望开发自定义客户端的用户提供指南。尽管各个模块文档中提供了全面的 API 定义,但本节重点概述与 Jetson 平台服务相关的主要调用流程。

  • 来自 VST 的视频流

  • 绊线和分析 Gem 创建

本节说明了在整个系统中使用 VST 和 eMDAT API 相关的调用流程。有关特定 API 签名的详细信息,请参阅 VST 和 eMDAT API 的各个专用章节。

从 VST 枚举流并添加到 DeepStream#

我们从 JPS 最基本的调用流程开始 - 流发现和推理。

此调用流程是 SDR 微服务操作的基础,其中来自 VST 微服务的流使用其流添加 API 添加到 DeepStream

启动时,SDR 从 VST v1/live/streams API 端点获取当前经过身份验证的流。这将返回以下格式的流列表

[
    {
        "44baa78d-76be-4ee9-aed5-da16c24edfec" :
        [
            {
                "isMain" : true,
                "metadata" :
                {
                    "bitrate" : "8000",
                    "codec" : "H264",
                    "framerate" : "30",
                    "govlength" : "60",
                    "resolution" : "1920x1080"
                },
                "name" : "Amcrest",
                "streamId" : "44baa78d-76be-4ee9-aed5-da16c24edfec",
                "url" : "rtsp://172.17.169.78/live/44baa78d-76be-4ee9-aed5-da16c24edfec"
            },
            {
                "isMain" : false,
                "metadata" :
                {
                    "bitrate" : "512",
                    "codec" : "H264",
                    "framerate" : "15",
                    "govlength" : "30",
                    "resolution" : "704x480"
                },
                "name" : "Amcrest-MediaProfile_Channel1_SubStream1",
                "streamId" : "44baa78d-76be-4ee9-aed5-da16c24edfec-MediaProfile00001",
                "url" : "rtsp://172.17.169.78/live/44baa78d-76be-4ee9-aed5-da16c24edfec-MediaProfile00001"
            }
        ]
    },
    {
        "a2c44a42-5a7f-4c7c-bed1-b2c6841d9350" :
        [
            {
                "isMain" : true,
                "metadata" :
                {
                    "bitrate" : "",
                    "codec" : "H264",
                    "framerate" : "",
                    "govlength" : "",
                    "resolution" : ""
                },
                "name" : "JPSD1",
                "streamId" : "a2c44a42-5a7f-4c7c-bed1-b2c6841d9350",
                "url" : "rtsp://172.17.169.78/live/a2c44a42-5a7f-4c7c-bed1-b2c6841d9350"
            }
        ]
    }
]

解析此 JSON,对于数组中的每个值,只有标记为 “isMain”: true 且具有非空 url 值的数组才添加到 DeepStream。

在初始检查之后,SDR 监听 Redis 事件,以查看 VST 中是否添加了任何新流。每次在 VST 中添加流并准备好进行流式传输时,VST 都会向 Redis 发送一个事件,格式如下

{
    "alert_type": "camera_status_change",
    "created_at": "2023-11-20T23:51:04Z",
    "event": {
        "camera_id": "JPSD7",
        "camera_name": "36398191-d48a-4260-b574-239fd59f156f",
        "camera_url": "rtsp://172.17.170.143/live/36398191-d48a-4260-b574-239fd59f156f",
        "change": "camera_streaming"
    },
    "source": "vst"
}

同样,删除事件也通过 Redis 从 VST 发送

{
    "alert_type": "camera_status_change",
    "created_at": "2023-11-20T23:51:04Z",
    "event": {
        "camera_id": "JPSD7",
        "camera_name": "36398191-d48a-4260-b574-239fd59f156f",
        "camera_url": "rtsp://172.17.170.143/live/36398191-d48a-4260-b574-239fd59f156f",
        "change": "camera_remove"
    },
    "source": "vst"
}

每次在 Redis 上发送新的流事件或从 VST v1/live/streams 端点获取时,SDR 都会解析它以确定是否应忽略该事件,是否应添加流或是否应删除流。如果例如更改事件不是 SDR 配置为监听的事件(默认情况下为 camera_streaming 和 camera_remove),如果缺少某些必需的值(camera_id、camera_name、camera_url),或者如果名称与正则表达式值匹配(默认情况下,这会检查以确保名称不包含子字符串 overlay(忽略大小写)),则会忽略事件。

为了从 DeepStream 添加和删除流,SDR 使用 DeepStream 中实现的添加/删除 API。当在 DeepStream 配置中使用 [source-list][source-attr-all] 而不是单个源(即 [source0][source1] 等)时,将启用此 API。

要将流添加到 DeepStream,必须向 https://127.0.0.1:9010/api/v1/stream/add 端点发出 POST 请求。请注意,localhost 可能需要更改为正确的 IP,并且端口从 9010 更改为其他端口 - 默认情况下,端口 9010 用于管道 1,端口 9011 用于管道 2,这在 DeepStream 配置文件中指定。以下 JSON 也必须包含在请求中

{
    "key": "sensor",
    "value": {
        "camera_id": "Amcrest_1",
        "camera_name": "Amcrest_1",
        "camera_url": "rtsp://10.136.27.7/live/7995217a-3f05-47a5-885d-50c937bf2ed5",
        "change": "camera_add",
        "metadata": {
            "resolution": "1920 x1080",
            "codec": "h264",
            "framerate": 30
        }
    },
    "headers": {
        "source": "vst",
        "created_at": "2021-06-01T14:34:13.417Z"
    }
}

要从 DeepStream 删除流,必须向 https://127.0.0.1:9010/api/v1/stream/remove 端点发出 POST 请求。同样,localhost 可能需要更改为正确的 IP 并指定正确的端口。以下 JSON 也必须包含在请求中

{
    "key": "sensor",
    "value": {
        "camera_id": "Amcrest_1",
        "camera_name": "Amcrest_1",
        "camera_url": "rtsp://10.136.27.7/live/7995217a-3f05-47a5-885d-50c937bf2ed5",
        "change": "camera_remove",
        "metadata": {
            "resolution": "1920 x1080",
            "codec": "h264",
            "framerate": 30
        }
    },
    "headers": {
        "source": "vst",
        "created_at": "2021-06-01T14:34:13.417Z"
    }
}

请注意,只有 camera_idcamera_namecamera_urlchange 值是必需的,其他所有内容都是可选的。

使用 WebRTC 从 VST 进行视频流传输#

WebRTC(Web 实时通信)是一种技术,可在 Web 浏览器和移动应用程序中直接实现实时通信,例如音频、视频和数据传输。它促进了点对点连接,绕过了对其他插件的需求。WebRTC 中的关键组件包括用于访问摄像头和麦克风的 MediaStream、用于维护直接连接的 RTCPeerConnection 和用于数据传输的 RTCDataChannel。该协议套件确保了高效、安全和通用的实时通信。

请参阅 - https://webrtc.org/getting-started/overview 以开始使用 WebRTC。

用户可以按照此处记录的 WebRTC 示例了解构建视频流中典型 WebRTC 对等方所涉及的步骤。WebRTC 示例 - webrtc/samples 。除了下面显示的 WebRTC 信令 API 外,构建 WebRTC 对等方还涉及调用 WebRTC 示例中捕获的标准 WebRTC API。

设备上运行的 VST 使用 WebRTC 作为视频流的默认协议。以下时序图捕获了客户端应用程序在实现 WebRTC 客户端以从 VST 流式传输视频时可以使用的实际 VST API 的详细信息。序列中显示的 API 是 VST 使用的自定义 WebRTC 信令 API,用于共享 STUN/TURN 服务器详细信息以进行 NAT 穿透,并在客户端应用程序和 VST 之间交换 ICE 候选详细信息。

../_images/video_streaming_flow.png

绊线和 ROI Gem 创建和使用#

创建和使用绊线和 ROI 是客户端应用程序使用的另一项核心功能。

这些 API 使用使用 VST API 检索的传感器名称,通过 HTTP POST 请求创建绊线/ROI Gem。

安装这些设备的坐标是根据摄像头分辨率在视频视场中的像素位置指定的。

创建

以下调用流程捕获了客户端应用程序用于创建新绊线的 API。

../_images/app_tw_create.png
查询

以下调用流程捕获了客户端应用程序用于查询绊线指标的 API

../_images/app_tw_metrics.png

ROI Gem#

创建

以下调用流程捕获了客户端用于创建新 ROI 的 API。

../_images/app_roi_create.png

查询

以下调用流程捕获了客户端用于查询 ROI 指标的 API

../_images/app_roi_metrics.png