Gst-nvstreamdemux#

Gst-nvstreamdemux 插件将批处理帧解复用为单个缓冲区。它为批处理中的每个帧创建一个单独的 Gst Buffer。它不复制视频帧。每个 Gst Buffer 都包含指向批处理中相应帧的指针。该插件将解批处理的 Gst Buffer 对象向下游推送到与每个帧的源对应的 pad 上。该插件通过 Gst-nvstreammux 附加的 NvDsBatchMeta 获取此信息。单个帧的原始缓冲区时间戳 (PTS) 也被附加回 Gst Buffer。由于没有帧复制,因此输入 Gst Buffer 不会立即向上游返回。当从输入批处理 Gst Buffer 解复用的所有非批处理 Gst Buffer 对象都由下游组件返回到解复用器时,输入批处理 Gst Buffer 将向上游返回。即使 Gst-nvstreammux 已缩放缓冲区,解复用器也不会将缓冲区缩放回源的原始分辨率。

Gst-nvstreamdemux

输入和输出#

  • 输入

    • Gst Buffer(批处理)

    • NvDsBatchMeta

    • 其他元数据

  • 控制参数

  • 输出

    • Gst Buffer(非批处理,单源)

    • 与每个 Gst Buffer 源相关的元数据

可以使用以下 Pipeline 测试此插件

用例 1#

  • 两个视频源使用 nvstreammux 多路复用在一起。

  • 多路复用器的输出进入配置了 batch-size=2 的 nvinfer。

  • 在 nvinfer 之后,我们使用 nvstreamdemux 来显示视频源 0 和 1 的内容,以及使用 nvdsosd 插件在两个单独的窗口上叠加的每个推理输出。

Pipeline (x86)

gst-launch-1.0 -e nvstreammux name=mux batch-size=2 width=1920 height=1080 ! nvinfer config-file-path=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_infer_primary.txt batch-size=2
! nvstreamdemux name=demux filesrc location=/ opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! queue !
mux.sink_0 filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.h264 ! h264parse ! nvv4l2decoder !
queue ! mux.sink_1 demux.src_0 ! "video/x-raw(memory:NVMM), format=NV12" ! queue ! nvvideoconvert ! "video/x-raw(memory:NVMM), format=RGBA" ! nvdsosd !
nvvideoconvert ! nveglglessink demux.src_1 ! queue ! "video/x-raw(memory:NVMM), format=NV12" ! queue ! nvvideoconvert ! "video/x-raw(memory:NVMM), format=RGBA" ! nvdsosd ! nveglglessink

Pipeline (Jetson)

gst-launch-1.0 -e nvstreammux name=mux batch-size=2 width=1920 height=1080 ! nvinfer config-file-path=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_infer_primary.txt batch-size=2  !
nvstreamdemux name=demux filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! queue !
mux.sink_0 filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.h264 ! h264parse ! nvv4l2decoder ! queue ! mux.sink_1 demux.src_0 ! "video/x-raw(memory:NVMM), format=NV12" !
queue ! nvvideoconvert ! "video/x-raw(memory:NVMM), format=RGBA" ! nvdsosd ! nvvideoconvert ! nv3dsink demux.src_1 ! queue ! "video/x-raw(memory:NVMM), format=NV12" ! queue ! nvvideoconvert ! "video/x-raw(memory:NVMM), format=RGBA" ! nv3dsink

用例 2#

  • 两个视频源使用 nvstreammux 多路复用在一起。

  • 多路复用器的输出进入配置了 batch-size=2 的 nvinfer。

  • 在 nvinfer 之后,我们使用 nvstreamdemux 将视频源 0 的内容以及使用 nvdsosd 插件叠加的推理输出写入文件。

  • 视频源 1 在解复用后的内容直接使用 nveglglessink 插件显示在屏幕上

Pipeline (x86)

gst-launch-1.0 -e nvstreammux name=mux batch-size=2 width=1920 height=1080 ! nvinfer config-file-path=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_infer_primary.txt batch-size=2  ! nvstreamdemux name=demux filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.h264 ! h264parse ! nvv4l2decoder ! queue ! mux.sink_0 filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.h264 ! h264parse ! nvv4l2decoder ! queue ! mux.sink_1 demux.src_0 ! "video/x-raw(memory:NVMM), format=NV12" ! queue ! nvvideoconvert ! "video/x-raw(memory:NVMM), format=RGBA" ! nvdsosd ! nvvideoconvert ! nvv4l2h264enc ! h264parse ! qtmux ! filesink location=./out.mp4 demux.src_1 ! queue ! nveglglessink

Pipeline (Jetson)

gst-launch-1.0 -e nvstreammux name=mux batch-size=2 width=1920 height=1080 ! nvinfer config-file-path=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_infer_primary.txt batch-size=2  ! nvstreamdemux name=demux filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.h264 ! h264parse ! nvv4l2decoder ! queue ! mux.sink_0 filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.h264 ! h264parse ! nvv4l2decoder ! queue ! mux.sink_1 demux.src_0 ! "video/x-raw(memory:NVMM), format=NV12" ! queue ! nvvideoconvert ! "video/x-raw(memory:NVMM), format=RGBA" ! nvdsosd ! nvvideoconvert ! nvv4l2h264enc ! h264parse ! qtmux ! filesink location=./out.mp4 demux.src_1 ! queue ! nv3dsink

用例 3#

用例 3 演示了在两个单独的窗口中按原样显示两个流。

  • 两个视频源使用 nvstreammux 多路复用在一起。

  • 多路复用器的输出进入配置了 batch-size=2 的 nvinfer。

  • 在 nvinfer 之后,我们使用 nvstreamdemux 在两个单独的窗口上显示视频源 0 和 1 的内容。

Pipeline (x86)

gst-launch-1.0 -e nvstreammux name=mux batch-size=2 width=1920 height=1080 ! nvinfer config-file-path=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_infer_primary.txt batch-size=2  ! nvstreamdemux name=demux filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.h264 ! h264parse ! nvv4l2decoder ! queue ! mux.sink_0 filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.h264 ! h264parse ! nvv4l2decoder ! queue ! mux.sink_1 demux.src_0 ! queue ! nvvideoconvert ! nveglglessink demux.src_1 ! queue ! nveglglessink

Pipeline (Jetson)

gst-launch-1.0 -e nvstreammux name=mux batch-size=2 width=1920 height=1080 ! nvinfer config-file-path=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_infer_primary.txt batch-size=2  ! nvstreamdemux name=demux filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.h264 ! h264parse ! nvv4l2decoder ! queue ! mux.sink_0 filesrc location=/opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.h264 ! h264parse ! nvv4l2decoder ! queue ! mux.sink_1 demux.src_0 ! queue ! nv3dsink demux.src_1 ! queue ! nv3dsink