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 源的两种实现 - udpsrc
和 nvdsudpsrc
。nvdsudpsrc
组件只能与 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

输入和输出#
输入
无
控制参数
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,具有未压缩的音频或视频帧。
功能#
下表总结了插件的功能。
功能 |
描述 |
发布版本 |
---|---|---|
支持标头和有效负载分离 |
可以为 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 属性。
属性 |
含义 |
类型和范围 |
示例/注释 |
平台 |
---|---|---|---|---|
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