Gst-nvmultiurisrcbin#

注意

DeepStream 6.2 及更高版本支持 nvmultiurisrcbin,并提供 REST API 支持,以实现动态传感器添加/移除功能。

此 bin 集成了三个主要的 DeepStream 组件,即 nvds_rest_server、nvurisrcbin 和 nvstreammux (Gst-nvstreammux),整合到一个 GstBin 中。有关 nvurisrcbin 的更多详细信息,请在安装了 DeepStream 的机器/Docker 容器上运行 gst-inspect-1.0 nvurisrcbin

该 bin 允许用户为 AI 多媒体分析创建简单的 GStreamer 管道。用户可以通过对 HTTP 端点进行的 REST API 调用来添加或移除传感器。传感器被定义为一个具有有效唯一传感器 ID 和 URI 的流媒体实体。

下面的高级概述图表和表格说明了 nvmultiurisrcbin 如何集成 nvds_rest_server、nvurisrcbin 和 nvstreammux。

Gst-nvmultiurisrcbin High Level Overview
Gst-nvmultiurisrcbin 集成组件的高级概述#

组件名称

DeepStreamSDK 包中的源代码路径,以获取更多信息

  1. REST API 服务器;nvds_rest_server

/opt/nvidia/deepstream/deepstream/sources/libs/nvds_rest_server/

  1. Bin 操作 API 库

/opt/nvidia/deepstream/deepstream/sources/libs/gstnvdscustomhelper/

  1. nvmultiurisrcbin

/opt/nvidia/deepstream/deepstream/sources/gst-plugins/gst-nvmultiurisrcbin/

  1. deepstream-test5-app 演示了 nvmultiurisrcbin 与 nvmsgconv 和 nvmsgbroker 的用法

/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test5/

  1. nvurisrcbin

/opt/nvidia/deepstream/deepstream/sources/gst-plugins/gst-nvurisrcbin/

  1. nvstreammux

源代码不可用。有关更多信息,请运行 gst-inspect-1.0 nvstreammux

1. 介绍#

此 GstBin 是一个 GStreamer 源 bin。该 bin 仅公开一个源 pad,该 pad 提供来自 nvstreammux 实例的批处理缓冲区。

用户可以为在 REST API 负载定义 部分中定义的 REST API 上进行批处理,向 bin 添加/移除流。

用户还可以提供静态流列表及其传感器 ID,以启动管道。这可以使用下面描述的 Gst 属性 uri-list 和 sensor-id-list 来完成。

nvmultiurisrcbin 组件输出来自 nvstreammux 实例的批处理缓冲区。

2. 特性#

下表总结了该 bin 的特性。

Gst-nvmultiurisrcbin 特性#

特性

描述

发布

nvmultiurisrcbin 集成 REST API 服务器、nvurisrcbin 和 nvstreammux

引入 nvmultiurisrcbin

DS 6.2

REST API 用于运行时添加和移除传感器

动态添加/移除传感器

DS 6.2

流特定

流添加和移除

DS 6.2

nvdspreprocess

更新预处理的 ROI

DS 6.4

nvv4l2decoder

“drop-frame-interval” 和 “skip-frame” 属性更新

DS 6.4

nvdsinfer

“interval” 属性更新

DS 6.4

nvdsinferserver

“interval” 属性更新

DS 6.4

nvv4l2encoder

“force-idr”、“force-intra”、“iframeinterval” 和 “bitrate” 属性更新

DS 6.4

nvstreammux

“batched-push-timeout” 属性更新

DS 6.4

nvvideoconvert

“src-crop”、“dest-crop”、“flip-method” 和 “interpolation-method” 属性更新

DS 6.4

nvdsosd

“process-mode” 属性更新

DS 6.4

应用程序特定

应用程序退出

DS 6.4

GET 请求

获取流信息

DS 7.0

3. 如何在管道中使用 nvmultiurisrcbin#

以下管道是一个示例 GStreamer 管道,配置为最多接受 10 个输入源,并且管道启动时带有两个源

gst-launch-1.0 nvmultiurisrcbin \
port=9000 ip-address=localhost \
batched-push-timeout=33333 max-batch-size=10 \
drop-pipeline-eos=1 live-source=1 \
uri-list=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4,file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4 width=1920 height=1080 \
! nvmultistreamtiler ! nveglglessink

下图说明了类似的管道(下游带有不同的插件,如 nvinfer、nvmsgconv 和 nvmsgbroker)。

Gst-nvmultiurisrcbin sample video pipeline

REST API 负载定义和示例 curl 命令以供参考#

注意

当前仅使用/强制使用下面描述的 JSON 模式中的少数字段。其余字段是可选的,将被忽略。

强制性(和使用)字段列表为

  • value/camera_id

  • value/camera_url

  • value/change

向 DeepStream 管道添加新流#

注意

DS-7.1 支持 REST API 版本 /api/v1。请参考以下模式详情。

负载定义和示例 curl 命令

1.curl -XPOST 'https://127.0.0.1:9000/api/v1/stream/add' -d '{
  "key": "sensor",
  "value": {
     "camera_id": "uniqueSensorID1",
     "camera_name": "front_door",
     "camera_url": "file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4",
     "change": "camera_add",
     "metadata": {
         "resolution": "1920 x1080",
         "codec": "h264",
         "framerate": 30
     }
 },
 "headers": {
     "source": "vst",
     "created_at": "2021-06-01T14:34:13.417Z"
 }
}'

2.curl -XPOST 'https://127.0.0.1:9000/api/v1/stream/add' -d '{
 "key": "sensor",
 "event": {
     "camera_id": "uniqueSensorID1",
     "camera_name": "front_door",
     "camera_url": "rtsp://xyz.mp4",
     "change": "camera_streaming",
     "metadata": {
         "resolution": "1920 x1080",
         "codec": "h264",
         "framerate": 30
     }
 },
 "headers": {
     "source": "vst",
     "created_at": "2021-06-01T14:34:13.417Z"
 }
}'

从 DeepStream 管道中移除新流#

负载定义和示例 curl 命令

curl -XPOST 'https://127.0.0.1:9000/api/v1/stream/remove' -d '{
    "key": "sensor",
    "value": {
        "camera_id": "uniqueSensorID1",
        "camera_name": "front_door",
        "camera_url": "file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4",
        "change": "camera_remove",
        "metadata": {
            "resolution": "1920 x1080",
            "codec": "h264",
            "framerate": 30
        }
    },
    "headers": {
        "source": "vst",
        "created_at": "2021-06-01T14:34:13.417Z"
    }
}'

4. Gst 属性#

直接配置 nvmultiurisrcbin 的 Gst 属性#

直接配置 bin 的 Gst-nvmultiurisrcbin gstreamer 属性#

属性

含义

类型和范围

示例注释

uri-list

源的逗号分隔 URI 列表;文件或 RTSP 源的 URI

字符串

uri-list=file:///opt/file.mp4,file:///opt/file.mp4

sensor-id-list

唯一源传感器 ID 的逗号分隔列表;此向量与 uri-list 一对一映射

字符串

sensor-id-list=uniqueSensorID1,uniqueSensorID2

sensor-name-list

可选的逗号分隔的源传感器名称列表;此向量与 uri-list 一对一映射

字符串

sensor-name-list=SensorName1,SensorName2

mode

仅视频或仅音频模式可用

0:仅视频 1:仅音频

mode=0 (默认)

ip-address

设置 REST API HTTP IP 地址

字符串

ip-address=localhost (默认)

port

设置 REST API HTTP 端口号;注意:用户可以传递 0 以禁用 REST API 服务器

字符串

port=9000 (默认)

max-batch-size

设置用于 nvstreammux 的最大批大小;此 nvmultiurisrcbin 实例支持的最大源数量

整数,1 到 4,294,967,295

max-batch-size=30 (默认)

用于配置在此 bin 中创建的每个 nvurisrcbin 实例的 Gst 属性#

Gst-nvmultiurisrcbin nvurisrcbin 特定属性#

属性

含义

类型和范围

示例注释

num-extra-surfaces

设置额外的解码器表面;解码器提供的最小解码表面之外的表面数量

整数,1 到 4,294,967,295

num-extra-surfaces=1 (默认)

gpu-id

设置 nvurisrcbin 组件(如解码器 (nvv4l2decoder) 和 nvvideoconvert)使用的 GPU 设备 ID

整数,1 到 4,294,967,295

gpu-id=0 (默认)

cudadec-memtype

cuda 解码器缓冲区的内存类型,CUDA 解码器缓冲区的内存类型。内部由枚举 CudaDecMemType 表示。0 (memtype_device):设备 1 (memtype_pinned):主机固定 2 (memtype_unified):统一

整数,0、1 或 2

cudadec-memtype=0 (默认)

drop-frame-interval

丢帧间隔,例如,值 5 表示解码器输出每第五帧,而其他帧被丢弃。

整数,1 到 30

默认值:0,dGPU / Jetson

dec-skip-frames

解码期间要跳过的帧类型。内部由枚举 SkipFrame 表示。0 (decode_all):解码所有帧 1 (decode_non_ref):跳过非参考帧(仅适用于 Jetson 平台) 2 (decode_key):解码关键帧

整数,0、1 或 2

skip-frames=0 默认值:0,dGPU / Jetson

select-rtp-protocol

用于 RTP 的传输协议

枚举 RtpProtocol 默认值:0,rtp-multi (0):rtp-multi - UDP + UDP 多播 + TCP (4):rtp-tcp - 仅 TCP

select-rtp-protocol=0 (默认)

file-loop

EOS 后循环文件源。Src 类型必须为 source-type-uri,并且 uri 以“file:/”开头

布尔值

file-loop=false (默认)

rtsp-reconnect-interval

自上次从 RTSP 源接收到数据后强制重新连接的超时时间(秒)。0=禁用超时

整数,1 到 4,294,967,295

rtsp-reconnect-interval=10

rtsp-reconnect-attempts

尝试重新连接的最大次数。设置为 -1 表示将无限次尝试重新连接。当源类型为 4 且 rtsp-reconnect-interval-sec 为非零正值时有效。

整数,>=-1

rtsp-reconnect-attempts=4

latency

抖动缓冲区大小(毫秒);仅适用于 RTSP 流。

整数,1 到 4,294,967,295

latency=100 (默认)

udp-buffer-size

UDP 缓冲区大小(字节);仅适用于 RTSP 流。

整数,1 到 4,294,967,295

udp-buffer-size=524288 (默认)

smart-record

启用智能录制并选择要响应的事件类型。源的类型必须为 source-type-rtsp

(0):smart-rec-disable - 禁用智能录制 (1):smart-rec-cloud  - 仅通过云消息触发智能录制 (2):smart-rec-multi  - 通过云事件和本地事件触发智能录制

smart-record=0 (默认)

smart-rec-dir-path

保存录制文件的目录路径。

字符串

绝对路径或相对路径

smart-rec-file-prefix

默认情况下,“Smart_Record”是前缀。为了获得唯一的文件名,必须为每个源提供唯一的前缀

字符串

绝对路径或相对路径

smart-rec-video-cache

视频缓存大小(秒)。已弃用:请改用 “smart-rec-cache”

整数,1 到 4,294,967,295

smart-rec-video-cache=0 (默认)

smart-rec-cache

缓存大小(秒),适用于音频和视频缓存

整数,1 到 4,294,967,295

smart-rec-cache=0 (默认)

smart-rec-container

录制视频的容器格式。支持 MP4 和 MKV 容器。源的类型必须为 source-type-rtsp

(0): smart-rec-mp4 - MP4 容器 (1): smart-rec-mkv - MKV 容器

smart-rec-container=0 (默认)

smart-rec-mode

智能录制模式

(0):smart-rec-mode-av - 如果可用,则录制音频和视频 (1):smart-rec-mode-video - 如果可用,则仅录制视频 (2):smart-rec-mode-audio - 如果可用,则仅录制音频

smart-rec-mode=0 (默认)

smart-rec-default-duration

如果未生成停止事件。此参数将确保在预定义的默认持续时间后停止录制。

整数,1 到 4,294,967,295

smart-rec-default-duration=20 (默认)

disable-passthrough

禁用 nvurisrcbin 内部使用的 nvvideoconvert 的直通模式

布尔值

disable-pashtorugh=false(默认)

drop-pipeline-eos

布尔属性,以便当所有源 pad 都处于 EOS 状态时,EOS 不会向下游传播。

布尔值

drop-pipeline-eos=false(默认)

async-handling

布尔属性,以便处理异步状态更改

布尔值

async-handling=true(默认)

disable-audio

在初始化时禁用音频路径模式

布尔值

disable-audio=true(默认)

ipc-buffer-timestamp-copy

复制 nvunixfdsrc 插件的缓冲区时间戳

布尔值

ipc-buffer-timestamp-copy=false(默认)

ipc-connection-attempts

最大连接尝试次数(-1 = 无限制)

整数。范围:-1 - 2147483647 默认值:-1

ipc-connection-attempts=-1(默认)

ipc-connection-interval

连接尝试之间的连接间隔(微秒)

无符号 64 位整数。范围:0 - 18446744073709551615

ipc-connection-interval=1000000(默认)

ipc-socket-path

用于控制共享内存传输的控制套接字的路径。这可以在 NULL->READY 转换期间修改

字符串

ipc-socket-path=null(默认)

low-latency-mode

为在解码器上具有 I 和 IPPP 帧的比特流设置低延迟模式

布尔值

low-latency-mode=false(默认)

message-forward

转发所有子消息

布尔值

message-forward=false(默认)

用于配置在此 bin 中创建的 nvstreammux 实例的 Gst 属性#

除 “batch-size” 之外的所有属性都可以使用与 此处 nvstreammux 定义的属性名称相同的属性名称进行配置。

5. 重要提示#

nvmultiurisrcbin 配置建议和关于预期行为的说明#

Gst-nvmultiurisrcbin 建议#

序号

预期行为和建议

1

nvstreammux,live-source 属性。live-source=1 需要打开 live-source,以便在源数量 < max-batch-size 配置时允许批处理可用缓冲区。

2

REST API stream/add 或 stream/remove 负载的 change 键值必须包含子字符串 add 或 remove。预期行为:如果 “change” 字段值中包含 “add”,则 sensorId 和 uri 将用于创建新流。如果 “change” 字段值中包含 “remove”,则 sensorId 和 uri 将用于查找并移除匹配的正在运行的流。

3

建议将布尔属性设置为 1,以通知 muxer 跳过向下游发送 EOS。当使用 nvmultiurisrcbin 时,drop-pipeline-eos=1 是首选默认值,以便在最后一个添加的传感器 EOS 之后,管道能够保持活动状态以接收新的传感器添加请求。drop-pipeline-eos=1

4

nvstreammux,max-batch-size 属性。设置的值表示在给定实例中可以添加的最大流数量。一旦流被移除或达到 EOS,pad ID 将被重用

6. 局限性#

Gst-nvmultiurisrcbin 已知问题#

序号

局限性

1

目前不支持将新的 nvstreammux 用于视频和音频用例,并且可能无法工作。