Gst-nvdsudpsrc#

Gst-nvdsudpsrc 插件是一种源类型组件,用于从网络接收 UDP-RTP 数据包。在内部,该插件使用 Rivermax SDK API 进行网络通信。NVIDIA Rivermax® 为任何媒体和数据流用例提供独特的基于 IP 的解决方案。有关更多详细信息,请参阅 Rivermax 产品页面。

Rivermax 利用内核旁路技术和 RDMA 功能来实现更好的 CPU 性能、低延迟和更高的带宽。在基于 Rivermax 的增强功能之上,还实施了一些内存和缓冲区管理优化,以进一步降低高数据包速率用例中的 CPU 利用率。

此组件还支持 RTP 标头和有效负载分离。RTP 标头和有效负载可以在单独的内存中接收。标头将始终位于系统内存中,而有效负载可以直接复制到 GPU(固定)内存。这可以避免在对 RTP 有效负载执行 GPU 处理时进行内存复制。只有当 header-size 属性设置为非零值且为固定标头大小时,才会发生标头和有效负载分离。

高分辨率未压缩视频流每秒具有非常多的 RTP 数据包。在这种情况下,OSS 解包组件 (rtpvrawdepay) 成为实时处理流的瓶颈。为了处理这种情况,nvdsudpsrc 添加了对根据 SMPTE 2110-20/30 规范解包未压缩视频和音频流的支持。在这种模式下,nvdsudpsrc 将提供 GstBuffer,其输出为完整的视频/音频帧,而不是 RTP 数据包。

注意

要在 nvdsudpsrc 中使用未压缩视频和音频有效负载的解包功能,对输入流有一些假设。

  • 每个 RTP 数据包必须是固定大小,具有固定的标头和有效负载大小。

  • 每个 RTP 数据包不应超过一个样本行数据 (SRD)。

通过对解包功能的支持,nvdsudpsrc 现在可以根据组件的 caps 属性值具有四种不同的操作模式。

默认模式

nvdsudpsrc 将接收来自网络的任何类型有效负载的 RTP 数据包,并将这些数据包推送到下游解包器组件进行解包。在这种模式下,nvdsudpsrc 组件与 RTP 数据包的内容无关。这是默认模式,源 pad 应具有 “application/x-rtp, ……” 作为 caps。

未压缩视频帧作为输出

nvdsudpsrc 将接收以未压缩视频作为有效负载的 RTP 数据包,并将按照 SMPTE 2110-20 规范进行解包,以形成视频帧,然后再发送到下游组件。当 caps 属性设置为 “video/x-raw(memory:NVMM), …..” caps 时,将激活此模式。

未压缩音频帧作为输出

nvdsudpsrc 将接收以未压缩音频作为有效负载的 RTP 数据包,并将按照 SMPTE 2110-30 规范进行解包,以形成音频帧,然后再发送到下游组件。当 caps 属性设置为 “audio/x-raw, …..” caps 时,将激活此模式。

通用数据作为输出

nvdsudpsrc 将接收具有任何类型有效负载的 RTP 数据包,并将进行解包以形成帧,然后再发送到下游组件。在这种情况下,帧边界不是基于 RTP/有效负载标头的解析来决定的,而是基于数据包数量的可配置值来决定的。即,payload-multiple 属性的值将决定多少个数据包被视为一个帧,并且 nvdsudpsrc 将删除这些数据包的 RTP 标头并将有效负载组合以形成一个帧。当 caps 属性设置为 “application/x-custom, …..” caps 时,将激活此模式。

系统还可以具有 Gstreamer 提供的 OSS udp 源 (udpsrc) 组件。在这种情况下,系统将具有 udp 源的两种实现 - udpsrcnvdsudpsrcnvdsudpsrc 组件只能与 NVIDIA ConnectX-5 及更高版本的卡一起使用,前提是已安装 Rivermax SDK 及其许可证。

  • 在此处下载并设置 Rivermax 1.40.x SDK:https://developer.nvidia.com/networking/rivermax-getting-started

  • 按照 SDK 页面上的说明获取 Rivermax 开发许可证。

  • 要从两个安装中选择 nvdsudpsrc,请使用 LOCAL_IFACE_IP 环境变量或 local-iface-ip 属性。使用以下命令导出环境变量

    export LOCAL_IFACE_IP=<IP of NIC>
    
  • nvdsudpsrc 组件还需要 CAP_NET_RAW 功能。以超级用户权限运行使用 nvdsudpsrc 组件的应用,或使用以下命令设置 CAP_NET_RAW 功能。

    sudo setcap CAP_NET_RAW=ep <absolute path of application>
    

    例如

    sudo setcap CAP_NET_RAW=ep /opt/nvidia/deepstream/deepstream/bin/deepstream-app
    
    sudo setcap CAP_NET_RAW=ep /usr/bin/gst-launch-1.0
    
Gst-nvdsudpsrc

输入和输出#

  • 输入

  • 控制参数

    • LOCAL_IFACE_IP ENV 标志或 local-iface-ip 属性

    • payload-size

    • header-size

    • num-packets

    • uri

    • address

    • port

    • source-address

    • caps

    • gpu-id

    • payload-multiple

  • 输出

    • GstBufferList,其缓冲区内容为 RTP 数据包。

    • GstBuffer,具有未压缩的音频或视频帧。

功能#

下表总结了插件的功能。

Gst-nvdsudpsrc 插件功能#

功能

描述

发布版本

支持标头和有效负载分离

可以为 RTP 标头和有效负载分配单独的内存

DS 6.0

支持任何类型的 RTP 数据包(压缩、未压缩、音频等)

对 RTP 有效负载的内容没有限制

DS 6.0

支持 RTCP 数据包

除了 RTP,还可以接收 RTCP 数据包

DS 6.0

支持直接在 GPU 内存中存储 RTP 有效负载

RTP 有效负载的内容可以直接位于 GPU 内存中。如果需要对有效负载进行 GPU 处理,这可以避免复制

DS 6.0

支持解包未压缩视频

可以将具有未压缩视频作为有效负载的 RTP 数据包进行解包,并根据 SMPTE 2110-20 规范转换为视频帧

DS 6.3

支持解包未压缩音频

可以将具有未压缩音频作为有效负载的 RTP 数据包进行解包,并根据 SMPTE 2110-30 规范转换为音频帧

DS 6.3

支持解包通用有效负载

可以将具有固定标头和有效负载大小的 RTP 数据包进行解包以形成帧。在这种模式下,将删除标头,并将有效负载组合以形成帧

DS 6.3

Gst 属性#

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

Gst-nvdsudpsrc 插件 gst 属性#

属性

含义

类型和范围

示例/注释

平台

port

用于接收 RTP 数据包的端口号

整数,0 到 65535

Port=5004

dGPU Jetson

address

用于接收数据包的服务器的 IP 地址

字符串

address=192.168.4.60

dGPU Jetson

uri

服务器的 Uri,格式为 udp://<ip>:<port>

字符串

uri=udp://192.168.4.60:5004

dGPU Jetson

payload-size

RTP 数据包中有效负载的大小

整数,0 到 65535

payload-size=1500

dGPU Jetson

header-size

RTP 标头大小

整数,0 到 65535

header-size=12

dGPU Jetson

num-packets

要为其分配内存的数据包数量

整数,0 到 2147483647

num-packets=10000

dGPU Jetson

local-iface-ip

与网络接口关联的 IP 地址,通过该接口接收数据

字符串

local-iface-ip=192.168.2.20

dGPU Jetson

buffer-size

内核接收缓冲区的大小,以字节为单位

整数,0 到 2147483647

buffer-size=50000

dGPU Jetson

reuse

启用端口重用

布尔值

reuse=1

dGPU Jetson

multicast-iface

要加入多播组的网络接口

字符串

multicast-iface=eth0

dGPU Jetson

auto-multicast

自动加入/离开多播组

布尔值

auto-multicast=1

dGPU Jetson

loop

用于设置多播环路参数

布尔值

loop=1

dGPU Jetson

source-address

单播地址,仅从该发送者接收数据

字符串

source-address=”192.168.3.4”

dGPU Jetson

gpu-id

GPU 设备 ID,用于分配缓冲区

整数,-1 到 32767

gpu-id=0

dGPU Jetson

payload-multiple

输出缓冲区是这些数据包数量的倍数

整数,0 到 65535

payload-multiple=4320

dGPU Jetson

示例管道#

  • 用于接收和播放 24 位 2 声道 48k 音频流的管道

    LOCAL_IFACE_IP=<ip address of NIC> gst-launch-1.0 nvdsudpsrc address=<unicast / multicast address> port=<port number> ! 'application/x-rtp, media=(string)audio, clock-rate=(int)48000, encoding-name=(string)L24, encoding-params=(string)2, channels=(int)2, payload=(int)97' ! rtpL24depay ! rawaudioparse use-sink-caps=1 ! queue ! autoaudiosink -v --gst-debug=3
    
  • 用于接收和显示 10 位 YUV 4:2:2 1080p30 视频流的管道

    gst-launch-1.0 nvdsudpsrc address=<unicast / multicast address> port=<port number> local-iface-ip=<ip addr of NIC> ! 'application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)10, width=(string)1920, height=(string)1080, colorimetry=(string)BT709, payload=(int)96' ! rtpvrawdepay ! nvvideoconvert ! nveglglessink -v --gst-debug=3
    
  • 用于接收和显示 10 位 YUV 4:2:2 1080p30 视频流的管道,无需 additional depayload component

    gst-launch-1.0 nvdsudpsrc address=<unicast / multicast address> port=<port number> local-iface-ip=<ip addr of NIC> caps='video/x-raw(memory:NVMM), width=1920, height=1080, format=(string)UYVP, framerate=30/1' header-size=20 payload-size=1200 ! nvvideoconvert ! nveglglessink -v --gst-debug=3
    
  • 用于接收和显示 10 位 YUV 4:2:2 1080p30 视频流的管道,无需额外的解包组件,并使用 GPU Direct

    gst-launch-1.0 nvdsudpsrc address=<unicast / multicast address> port=<port number> local-iface-ip=<ip addr of NIC> caps='video/x-raw(memory:NVMM), width=1920, height=1080, format=(string)UYVP, framerate=30/1' header-size=20 payload-size=1200 gpu-id=0 ! nvvideoconvert ! nveglglessink -v --gst-debug=3
    
  • 用于接收和播放 24 位 2 声道 48k 音频流的管道,无需额外的解包组件

    gst-launch-1.0 nvdsudpsrc address=<unicast / multicast address> local-iface-ip=<ip address of NIC> port=<port number> caps='audio/x-raw, format=(string)S24BE, layout=(string)interleaved, rate=(int)48000, channels=(int)2' payload-size=288 header-size=12 ! autoaudiosink -v --gst-debug=3
    
  • 用于接收和解包通用有效负载的管道。以下管道接收未压缩视频作为通用有效负载

    gst-launch-1.0 nvdsudpsrc address=<unicast / multicast address> local-iface-ip=<ip address of NIC> port=<port number> caps='application/x-custom', header-size=20, payload-size=1200, payload-multiple=4320 ! fakesink -v --gst-debug=3