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。

组件名称 |
DeepStreamSDK 包中的源代码路径,以获取更多信息 |
---|---|
|
/opt/nvidia/deepstream/deepstream/sources/libs/nvds_rest_server/ |
|
/opt/nvidia/deepstream/deepstream/sources/libs/gstnvdscustomhelper/ |
|
/opt/nvidia/deepstream/deepstream/sources/gst-plugins/gst-nvmultiurisrcbin/ |
|
/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test5/ |
|
/opt/nvidia/deepstream/deepstream/sources/gst-plugins/gst-nvurisrcbin/ |
|
源代码不可用。有关更多信息,请运行 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 的特性。
特性 |
描述 |
发布 |
---|---|---|
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)。

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 属性#
属性 |
含义 |
类型和范围 |
示例注释 |
---|---|---|---|
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 属性#
属性 |
含义 |
类型和范围 |
示例注释 |
---|---|---|---|
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 配置建议和关于预期行为的说明#
序号 |
预期行为和建议 |
---|---|
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. 局限性#
序号 |
局限性 |
---|---|
1 |
目前不支持将新的 nvstreammux 用于视频和音频用例,并且可能无法工作。 |