Gst-nvstreammux#

Gst-nvstreammux 插件从多个输入源形成帧批次。当将源连接到 nvstreammux(复用器)时,必须使用 gst_element_get_request_pad() 和 pad 模板 sink_%u 从复用器请求新的 pad。有关更多信息,请参阅 DeepStream 应用程序源代码中的 link_element_to_streammux_sink_pad()。复用器形成批次大小帧的批处理缓冲区。(批次大小使用 gst 对象属性指定。)如果复用器的输出格式和输入格式相同,则复用器将来自该源的帧作为复用器输出批处理缓冲区的一部分转发。当复用器取回其输出缓冲区时,帧将返回到源。如果分辨率不同,则复用器将来自输入的帧缩放到批处理缓冲区中,然后将输入缓冲区返回到上游组件。当批次已满或达到批次形成超时 batched-pushed-timeout 时,复用器会将批次向下游推送。超时在收集到新批次的第一个缓冲区时开始运行。复用器使用循环算法从源收集帧。它尝试从每个源收集每个批次的平均帧数(批次大小/源数量)(如果所有源都是活动的且它们的帧速率都相同)。但是,每个源的数量都不同,具体取决于源的帧速率。复用器输出单个分辨率(即,批次中的所有帧都具有相同的分辨率)。可以使用 width 和 height 属性指定此分辨率。复用器将所有输入帧缩放到此分辨率。可以将 enable-padding 属性设置为 true,以在缩放时通过用黑色条带填充来保持输入纵横比。对于 DGPU 平台,可以使用 gpu-id 属性指定用于缩放和内存分配的 GPU。对于每个需要缩放到复用器输出分辨率的源,复用器都会创建一个缓冲区池,并为每个大小分配四个缓冲区

output width*output height*f

其中 f 对于 NV12 格式为 1.5,或对于 RGBA4.0。内存类型由 nvbuf-memory-type 属性确定。将 live-source 属性设置为 true 以告知复用器源是活动的。在这种情况下,复用器将最后一个复制的输入缓冲区的 PTS 附加到批处理的 Gst 缓冲区的 PTS。如果该属性设置为 false,则复用器根据首先与复用器协商功能的源的帧速率计算时间戳。复用器将 NvDsBatchMeta 元数据结构附加到输出批处理缓冲区。此元数据包含有关复制到批次中的帧的信息(例如,帧的源 ID、输入帧的原始分辨率、输入帧的原始缓冲区 PTS)。连接到 Sink_N pad 的源将在 NvDsBatchMeta 中具有 pad_index N。复用器支持在运行时添加和删除源。当复用器从新源接收到缓冲区时,它会发送 GST_NVEVENT_PAD_ADDED 事件。当删除复用器 sink pad 时,复用器会发送 GST_NVEVENT_PAD_DELETED 事件。这两个事件都包含正在添加或删除的源的源 ID(请参阅 sources/includes/gst-nvevent.h)。下游元素可以在接收到这些事件时重新配置。此外,复用器还会发送 GST_NVEVENT_STREAM_EOS 以指示来自源的 EOS。复用器支持计算源帧的 NTP 时间戳。它支持两种模式。在系统时间戳模式下,复用器将当前系统时间附加为 NTP 时间戳。在 RTCP 时间戳模式下,复用器使用 RTCP 发送者报告来计算帧在源处生成时的 NTP 时间戳。NTP 时间戳在 NvDsFrameMetantp_timestamp 字段中设置。可以通过设置 attach-sys-ts 属性来切换模式。有关更多详细信息,请参阅 DeepStream 中的 NTP 时间戳部分。

Gst-nvstreammux

输入和输出#

  • 输入

    • 来自任意数量源的 NV12/RGBA 缓冲区

  • 控制参数

    • batch-size(批次大小)

    • batched-push-timeout(批次推送超时)

    • width(宽度)

    • height(高度)

    • enable-padding(启用填充)

    • gpu-id(仅限 dGPU)

    • live-source(实时源)

    • nvbuf-memory-type(nvbuf 内存类型)

    • num-surfaces-per-frame(每帧表面数)

    • buffer-pool-size(缓冲区池大小)

    • attach-sys-ts(附加系统时间戳)

    • frame-duration(帧持续时间)

  • 输出

    • NV12/RGBA 批处理缓冲区

    • GstNvBatchMeta(包含有关批处理缓冲区中各个帧信息的元数据)

特性#

下表总结了插件的特性。

Gst-nvstreammux 插件特性#

特性

描述

发布版本

可配置的批次大小

DS 2.0

可配置的批处理超时

DS 2.0

允许具有不同分辨率的多个输入流

DS 2.0

允许具有不同帧速率的多个输入流

DS 2.0

在复用器中缩放到用户确定的分辨率

DS 2.0

缩放时通过填充保持纵横比

DS 2.0

多 GPU 支持

DS 2.0

输入流 DRC 支持

DS 3.0

用户可配置的 CUDA 内存类型(固定/设备/统一)用于输出缓冲区

DS 3.0

自定义消息,用于通知应用程序来自各个源的 EOS

DS 3.0

支持添加和删除运行时 sinkpad(输入源)并发送自定义事件以通知下游组件

DS 3.0

支持在输出端处理 RGBA 数据

DS 3.0

Gst 属性#

下表描述了 Gst-nvstreammux 插件的 Gst 属性。

Gst-nvstreammux gst-properties#

属性

含义

类型和范围

示例注释

batch-size(批次大小)

批次中的最大帧数。

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

batch-size=30

batched-push-timeout(批次推送超时)

在第一个缓冲区可用后等待以推送批次的超时时间(以微秒为单位),即使未形成完整批次。

有符号整数,-1 到 2,147,483,647

batched-push-timeout= 40000 40 毫秒

width(宽度)

如果非零,则复用器将输入帧缩放到此宽度。

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

width=1280

height(高度)

如果非零,则复用器将输入帧缩放到此高度。

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

height=720

enable-padding(启用填充)

在缩放输入帧时,通过用黑色边框填充来保持纵横比。

布尔值

enable-padding=1

gpu-id

要在其上分配设备或统一内存以用于复制或缩放缓冲区的 GPU ID。(仅限 dGPU。)

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

gpu-id=1

live-source(实时源)

向复用器指示源是活动的,例如 RTSP 或 USB 摄像头等实时馈送。

布尔值

live-source=1

nvbuf-memory-type(nvbuf 内存类型)

要分配的内存类型。对于 dGPU

0 (nvbuf-mem-default):默认内存,cuda-device

1 (nvbuf-mem-cuda-pinned):固定/主机 CUDA 内存

2 (nvbuf-mem-cuda-device) 设备 CUDA 内存

3 (nvbuf-mem-cuda-unified):统一 CUDA 内存

对于 Jetson

0 (nvbuf-mem-default):默认内存,表面阵列

4 (nvbuf-mem-surface-array):表面阵列内存

整数,0-4

nvbuf-memory-type=1

num-surfaces-per-frame(每帧表面数)

每帧最大表面数

整数,1-4

num-surfaces-per-frame=4

buffer-pool-size(缓冲区池大小)

输出缓冲区池中的缓冲区数量

整数<=1024

buffer-pool-size=4

attach-sys-ts(附加系统时间戳)

将系统时间戳附加为 ntp 时间戳,否则 ntp 时间戳从 RTCP 发送者报告计算

布尔值

attach-sys-ts=TRUE

compute-hw

用于缩放的计算引擎。

0 - 默认

1 - GPU

2 - VIC(仅限 Jetson)

整数,0-2

compute-hw=1

interpolation-method

设置插值方法

整数,有关有效值,请参阅 nvbufsurftransform.h 中的枚举 NvBufSurfTransform_Inter

interpolation-method=1

sync-inputs

使用 PTS 同步输入帧的布尔属性

布尔值

sync-inputs=1

frame-duration(帧持续时间)

输入帧的持续时间(以毫秒为单位),用于基于帧速率的 NTP 时间戳校正。如果设置为 0,则帧持续时间会根据在 RTP 抖动缓冲区中看到的 PTS 值自动推断。当 RTP 抖动缓冲区和 nvstreammux 之间的帧持续时间发生变化时,可以使用此属性来指示 nvstreammux 的正确帧速率,例如,当管道中在 nvstreammux 之前存在 audiobuffersplit GstElement 时。如果设置为 -1 (GST_CLOCK_TIME_NONE),则禁用基于帧速率的 NTP 时间戳校正。(默认)

无符号 64 位整数,0 到 18446744073709551615

frame-duration=10

drop-pipeline-eos

布尔属性,用于控制当所有 sink pad 处于 EOS 时来自 nvstreammux 的 EOS 向下游传播。(实验性)

布尔值

drop-pipeline-eos=0(默认),适用于 dGPU/Jetson

已知问题与解决方案和 FAQ#

1. 在旧版和新版 streammux 之间切换时,gst-inspect 未正确更新#

删除默认存在于主目录中的 gstreamer 缓存 (rm ~/.cache/gstreamer-1.0/registry.x86_64.bin) 并在 streammux 插件上重新运行 gst-inspect