Gst-nvdsudpsink#
Gst-nvdsudpsink 插件是一种 sink 类型组件,可用于通过 IP 网络传输 RTP 数据包。在内部,该插件使用 Rivermax SDK API 进行网络通信。NVIDIA Rivermax® 为任何媒体和数据流用例提供独特的基于 IP 的解决方案。有关更多详细信息,请参阅 Rivermax 产品页面。
nvdsudpsink
可以根据输入类型和组件设置的属性在三种不同的模式下运行。
- 使用 Rivermax Generic API 的 RTP 数据包
这是默认模式。在此模式下,nvdsudpsink 将接收 RTP 数据包,并使用 Rivermax 通用 API 将其传输到网络。nvdsudpsink 不需要任何关于 RTP 数据包内容的信息。
- 使用 Rivermax Media API 的 RTP 数据包
此模式适用于 SMPTE 2110-20、30 流的特定用例。在此模式下,nvdsudpsink 支持具有流量整形的 SMPTE 2110-20 和 SMPTE 2110-30 流。nvdsudpsink 期望 RTP 数据包具有未压缩的音频或视频作为有效负载,并将使用 Rivermax 媒体 API 将这些数据包传输到网络。
由于 Rivermax 媒体 API 需要知道正在传输的数据信息才能处理流量整形,因此 nvdsudpsink 需要以 SDP 文件的形式提供该信息,以便 Rivermax 初始化。
可以通过设置组件的
sdp-file
属性来启用此模式。在此模式下,对于未压缩的视频流,必须设置packets-per-line
和payload-size
属性以及sdp-file
。同样,payloader 组件的mtu
属性值必须与nvdsudpsink
的payload-size
相同。对于此模式下的未压缩音频流,必须设置 payloader 组件的
max-ptime
和ptime-multiple
属性。
- 使用 Rivermax 媒体 API 的未压缩数据
在此模式下,nvdsudpsink 期望直接接收未压缩的音频或视频帧,而不是 RTP 数据包。该组件会将这些帧转换为 RTP 数据包,然后使用 Rivermax 媒体 API 通过网络传输。
如果除了模式 #2 的要求之外,传入数据是未压缩的视频或音频帧而不是 RTP 数据包,则将启用此模式。
在此模式下,如果设置了
render-thread-core
属性,则将创建一个单独的线程来打包帧并传输数据包。该线程还将绑定到作为属性值提供的 CPU 核心。
注意
在此模式下,作为未压缩视频输入,仅支持 YUV 4:2:2 和 RGB,位深度为 8 或 10。
一些常用格式的有效负载大小和每行数据包数
要计算有效负载大小和每行数据包数,请使用以下步骤
按如下方式计算行步幅:
line stride = (width * pgroup size) / pgroup coverage
将此步幅划分为具有相等字节数的多个数据包。这将是每行数据包的值。
在步骤 2 中计算的每个数据包的大小上加上 20 个字节,用于 RTP + 有效负载标头。这将是有效负载大小的值。
注意
假设每个 RTP 数据包只有单个样本行数据,并且行步幅可被均分。
以下是一些常用格式的值
YCbCr-4:2:2 1920x1080 8 bit: payload-size:1300, packets-per-line:3 YCbCr-4:2:2 1920x1080 10 bit: payload-size:1220, packets-per-line:4 YCbCr-4:2:0 1920x1080 8 bit: payload-size:1460, packets-per-line:2 YCbCr-4:2:0 1920x1080 10 bit: payload-size:1220, packets-per-line:3 RGB 1920x1080 8 bit: payload-size:1460, packets-per-line:4 RGB 1920x1080 10 bit: payload-size:1220, packets-per-line:6
有关更多信息,请参阅 SMPTE ST 2110-20:2017
。
系统还可以具有 Gstreamer 提供的 udp sink (udpsink
) 组件的 OSS 实现。在这种情况下,系统将具有 udp sink 的两种实现 - udpsink
和 nvdsudpsink
。nvdsudpsink
组件只能与 NVIDIA ConnectX-5 及更高版本的网卡一起使用,前提是已安装 Rivermax
SDK 及其许可证。
在此处下载并设置
Rivermax
1.40.x SDK:https://developer.nvidia.com/networking/rivermax-getting-started。按照 SDK 页面上的说明获取 Rivermax 的开发许可证。
要从两个安装中选择
nvdsudpsink
,请使用LOCAL_IFACE_IP
环境变量或local-iface-ip
属性。使用以下命令导出环境变量export LOCAL_IFACE_IP=<IP of NIC>
nvdsudpsink
组件还需要CAP_NET_RAW
功能。可以使用超级用户权限运行使用nvdsudpsink
组件的应用程序,或者使用以下命令设置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

输入和输出#
输入
GstBufferList,其缓冲区内容为 RTP 数据包。
GstBuffer,具有未压缩的音频或视频帧。
控制参数
LOCAL_IFACE_IP ENV 标志或 local-iface-ip 属性
host
port
chunk-size
packets-per-chunk
payload-size
sdp-file
packets-per-line
internal-thread-core
ptp-src
render-thread-core
输出
无
特性#
下表总结了插件的特性。
特性 |
描述 |
发布版本 |
---|---|---|
支持 Rivermax Generic 和 Media API |
默认情况下,它支持通用 API,但可以通过设置 sdp-file 属性来启用媒体 API。 |
DS 6.1 |
使用通用 API 支持任何类型的 RTP 数据包(压缩、未压缩、音频等) |
在使用通用 API 的情况下,对 RTP 有效负载的内容没有限制。 |
DS 6.1 |
除了 RTP 外,还支持 RTCP 数据包 |
也可以传输 RTCP 数据包。 |
DS 6.1 |
未压缩流(视频和音频)的流量整形 |
通过使用 Rivermax 媒体 API,可以为未压缩的视频和音频流启用数据包 pacing。 |
DS 6.1 |
支持 SMPTE 2110-20 |
通过 Rivermax 媒体 API 支持具有数据包 pacing 的未压缩 SMPTE 2110-20 流。 |
DS 6.1 |
支持 SMPTE 2110-30 |
通过 Rivermax 媒体 API 支持具有数据包 pacing 的未压缩 SMPTE 2110-30 流。 |
DS 6.1 |
支持未压缩视频的 RTP 数据包化 |
作为输入的未压缩视频可以根据 SMPTE 2110-20 转换为 RTP 数据包,然后再发送到网络 |
DS 6.2 |
支持未压缩音频的 RTP 数据包化 |
作为输入的未压缩音频可以根据 SMPTE 2110-30 转换为 RTP 数据包,然后再发送到网络 |
DS 6.2 |
支持 PTP 时钟 |
除了系统时钟外,还可以使用来自 PTP 源(网卡)的硬件时钟来生成 RTP 数据包时间戳 |
DS 6.2 |
支持渲染线程亲和性 |
用于打包和传输数据的单独线程。此线程可以绑定到特定的 CPU 核心 |
DS 6.2 |
Gst 属性#
下表描述了 Gst-nvdsudpsink 插件的 Gst 属性。
属性 |
含义 |
类型和范围 |
示例/注释 |
平台 |
---|---|---|---|---|
port |
用于发送 RTP 数据包的端口号 |
整数,0 到 65535 |
Port=5004 |
dGPU Jetson |
host |
用于发送数据包的单播/多播地址 |
字符串 |
address=192.168.4.60 |
dGPU Jetson |
chunk-size |
在使用通用 API 的情况下要分配的 chunk 数量 |
整数,1 到 65535 |
chunk-size=100 |
dGPU Jetson |
packets-per-chunk |
每个 chunk 的数据包数 |
整数,1 到 65535 |
packets-per-chunk=10 |
dGPU Jetson |
payload-size |
RTP 数据包中有效负载的大小 |
整数,0 到 65535 |
payload-size=1400 |
dGPU Jetson |
packets-per-line |
在使用媒体 API 的情况下,每行的数据包数 |
整数,1 到 65535 |
packets-per-line=4 |
dGPU Jetson |
sdp-file |
SDP 文件的路径,用于启用 Rivermax 媒体 API 的使用 |
字符串 |
sdp-file=”sdp_video.txt” |
dGPU Jetson |
local-iface-ip |
与要通过其传输数据的网络接口关联的 IP 地址 |
字符串 |
local-iface-ip=”192.168.2.20” |
dGPU Jetson |
internal-thread-core |
运行 Rivermax 内部线程的 CPU 核心 |
整数,-1 到 1023 |
internal-thread-core=2 |
dGPU Jetson |
ptp-src |
PTP 源的 IP 地址 |
字符串 |
ptp-src=”192.168.2.20” |
dGPU Jetson |
render-thread-core |
用于渲染线程的逗号分隔的 CPU 核心列表 |
字符串 |
render-thread-core=”2,3” |
dGPU Jetson |
示例 Pipeline#
使用 Rivermax 媒体 API 传输 24 位 2 声道 48k 音频流的 Pipeline
gst-launch-1.0 audiotestsrc wave=8 ! 'audio/x-raw, format=(string)S24BE, rate=48000, channels=2, payload=(int)97' ! rtpL24pay ptime-multiple=1000000 max-ptime=1000000 seqnum-offset=0 pt=97 ! nvdsudpsink host=<ip address> port=<port number> local-iface-ip=<ip addr of NIC> sdp-file=<sdp file> internal-thread-core=4 -v --gst-debug=3
使用单独的 payload 组件,使用 Rivermax 媒体 API 传输 10bit YUV 4:2:2 1080p30 视频流的 Pipeline
gst-launch-1.0 videotestsrc ! 'video/x-raw, width=1920, height=1080, format=(string)UYVP, framerate=30/1' ! queue ! rtpvrawpay mtu=1220 ! nvdsudpsink host=<ip address> port=<port number> local-iface-ip=<ip addr of NIC> payload-size=1220 packets-per-line=4 sdp-file=<sdp file> -v --gst-debug=3
不使用额外的 payload 组件,使用 Rivermax 媒体 API 传输 10bit YUV 4:2:2 1080p60 视频流的 Pipeline
gst-launch-1.0 videotestsrc ! 'video/x-raw, width=1920, height=1080, format=(string)UYVP, framerate=60/1' ! queue ! nvdsudpsink host=<ip address> port=<port number> local-iface-ip=<ip addr of NIC> payload-size=1220 packets-per-line=4 sdp-file=<sdp file> -v --gst-debug=3
使用 NIC 的 PTP 硬件时钟的 Pipeline
gst-launch-1.0 videotestsrc ! 'video/x-raw, width=1920, height=1080, format=(string)UYVP, framerate=60/1' ! queue ! nvdsudpsink host=<ip address> port=<port number> local-iface-ip=<ip addr of NIC> payload-size=1220 packets-per-line=4 sdp-file=<sdp file> ptp-src=<ip addr of PTP source> -v --gst-debug=3
使用单独的渲染线程并将其绑定到 CPU 核心的 Pipeline
gst-launch-1.0 videotestsrc ! 'video/x-raw, width=1920, height=1080, format=(string)UYVP, framerate=60/1' ! queue ! nvdsudpsink host=<ip address> port=<port number> local-iface-ip=<ip addr of NIC> payload-size=1220 packets-per-line=4 sdp-file=<sdp file> ptp-src=<ip addr of PTP source> render-thread-core="list of core(s)" sync=0 -v --gst-debug=3