Gst-nvstreammux插件从多个输入源生成一批帧。当将一个源连接到nvstreammux (muxer)时,必须使用gst_element_get_request_pad()和pad模板sink_%u从muxer请求一个新的pad。有关更多信息,请参阅DeepStream应用程序源代码中的link_element_to_streammux_sink_pad()。muxer形成批量大小帧的批量缓冲区。(batch-size使用GST对象属性指定。)如果muxer的输出格式和输入格式相同,muxer将来自该源的帧作为muxer输出批处理缓冲区的一部分转发。当muxer返回它的输出缓冲区时,帧被返回到源。如果分辨率不相同,muxer将帧从输入缩放到批处理缓冲区,然后将输入缓冲区返回给上游组件。当批被填充时,muxer将批推到下游,或者达到批生成超时batch -push -timeout。当收集新批处理的第一个缓冲区时,超时开始运行。muxer使用循环算法从源中收集帧。它尝试从每个源(如果所有源都是实时的并且它们的帧速率都相同)中收集每批(batch-size/num-source)帧的平均值。不过,这个数字因每个源而异,取决于源的帧速率。muxer输出单一分辨率(即批处理中的所有帧都具有相同的分辨率)。这个分辨率可以使用width和height属性指定。muxer将所有输入帧缩放到此分辨率。enable-padding属性可以设置为true来保留输入宽高比,同时使用黑色带进行填充。对于DGPU平台,用于缩放和内存分配的GPU可以通过GPU -id属性指定。对于每个需要缩放到muxer输出分辨率的源,muxer创建一个缓冲池,并分配四个大小为:
output width*output height*f
其中,NV12格式的f为1.5,RGBA格式的f为4.0。内存类型由nvbuf-memory-type属性决定。将live-source属性设置为true以通知muxer源是活动的。在这种情况下,muxer将最后一个复制的输入缓冲区的PTS附加到批处理的Gst缓冲区的PTS上。如果该属性设置为false, muxer将根据第一次与muxer协商能力的源的帧速率计算时间戳。muxer将NvDsBatchMeta元数据结构附加到输出批处理缓冲区。这个元数据包含了关于复制到批处理中的帧的信息(例如帧的源ID,输入帧的原始分辨率,输入帧的原始缓冲PTS)。连接到Sink_N pad的源将在NvDsBatchMeta中有pad_index N。muxer支持在运行时添加和删除源。当muxer从一个新源接收到一个缓冲区时,它会发送一个GST_NVEVENT_PAD_ADDED事件。当一个muxer接收垫被移除时,muxer会发送一个GST_NVEVENT_PAD_DELETED事件。两个事件都包含要添加或删除的源的源ID(参见sources/includes/gst- event.h)。下游元素在接收到这些事件时可以重新配置。此外,muxer还发送一个GST_NVEVENT_STREAM_EOS来指示来自源的EOS。muxer支持计算源帧的NTP时间戳。支持两种模式。在系统时间戳模式下,muxer将当前系统时间附加为NTP时间戳。在RTCP时间戳模式下,muxer使用RTCP发送者报告(RTCP Sender Report)计算帧在源端生成时的NTP时间戳。NTP时间戳设置在NvDsFrameMeta的ntp_timestamp字段中。可以通过设置attachment -sys-ts属性来切换模式。详情请参见DeepStream中的NTP时间戳。
![](https://i-blog.csdnimg.cn/blog_migrate/7d359cbbedc58c24cf61d01e1b0c4e33.png)
输入和输出
输入
NV12/RGBA缓冲来自任意数量的源
控制参数
批量大小
batched-push-timeout
宽度
高度
enable-padding
gpu-id(仅限dGPU)
live-source
nvbuf-memory-type
num-surfaces-per-frame
缓冲池大小
attach-sys-ts
frame-duration
输出
NV12/RGBA批处理缓冲区
GstNvBatchMeta(包含批处理缓冲区中各个帧的信息的元)
特性
下表总结了插件的特性。
Gst-nvstreammux插件特性
功能 | 描述 | 版本 |
可配置批量大小 | — | DS 2.0 |
可配置的批处理超时 | — | DS 2.0 |
允许不同分辨率的多个输入流 | — | DS 2.0 |
允许多个输入流与不同的帧速率 | — | DS 2.0 |
在muxer中缩放到用户决定的分辨率 | — | DS 2.0 |
缩放,同时保持宽高比与填充 | — | DS 2.0 |
多GPU支持 | — | DS 2.0 |
输入流DRC支持 | — | DS 3.0 |
用户可配置的CUDA内存类型(固定/设备/统一)输出缓冲区 | — | DS 3.0 |
为个别源,自定义消息通知应用程序的EOS | — | DS 3.0 |
支持添加和删除运行时接受垫(输入源),并发送自定义事件以通知下游组件 | — | DS 3.0 |
在输出时支持RGBA数据处理 | — | DS 3.0 |
Gst属性
下表描述了Gst-nvstreammux插件的Gst属性。
Gst-nvstreammux的gst属性
属性 | 含义 | 类型和范围 | 示例 |
batch-size | 批处理的最大帧数。 | 整型 0 ~ 4294967295 | batch-size=30 |
batched-push-timeout | 即使尚未形成完整的批处理,在第一个缓冲区可用以推送批处理后等待的超时(以微秒为单位)。 | 有符号整型 -1 ~ 2,147,483,647 | batched-push-timeout= 40000 40 msec |
width | 如果非零,muxer将输入帧缩放到此宽度。 | 整型 0 ~ 4294967295 | width=1280 |
height | 如果非零,muxer将输入帧缩放到此高度。 | 整型 0 ~ 4294967295 | height=720 |
enable-padding | 当缩放输入帧时,通过填充黑色边框来维持纵横比。 | 布尔型 | enable-padding=1 |
gpu-id | 分配用于复制或缩放缓冲区的设备或统一内存的GPU的ID。(只dGPU。) | 整型 0 ~ 4294967295 | gpu-id=1 |
live-source | 向muxer指示来源是实时的,例如实时馈送,如RTSP或USB摄像头。 | 布尔型 | live-source=1 |
nvbuf-memory-type | 要分配的内存类型。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内存 杰森: 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时间戳,否则从RTCP发送方报告中计算ntp时间戳 | 布尔型 | 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,将禁用基于帧速率的NTP时间戳校正。 | 有符号整型 -1 ~ - 147483647 | frame-duration=10 |
drop-pipeline-eos | 当所有接收垫都在EOS时,控制从nvstreammux向下游的EOS传播的布尔属性。(实验) | 布尔型 | drop-pipeline-eos=0(default) for dGPU/Jetson |