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-linepayload-size 属性以及 sdp-file。同样,payloader 组件的 mtu 属性值必须与 nvdsudpsinkpayload-size 相同。

  • 对于此模式下的未压缩音频流,必须设置 payloader 组件的 max-ptimeptime-multiple 属性。

使用 Rivermax 媒体 API 的未压缩数据

在此模式下,nvdsudpsink 期望直接接收未压缩的音频或视频帧,而不是 RTP 数据包。该组件会将这些帧转换为 RTP 数据包,然后使用 Rivermax 媒体 API 通过网络传输。

  • 如果除了模式 #2 的要求之外,传入数据是未压缩的视频或音频帧而不是 RTP 数据包,则将启用此模式。

  • 在此模式下,如果设置了 render-thread-core 属性,则将创建一个单独的线程来打包帧并传输数据包。该线程还将绑定到作为属性值提供的 CPU 核心。

注意

在此模式下,作为未压缩视频输入,仅支持 YUV 4:2:2 和 RGB,位深度为 8 或 10。

一些常用格式的有效负载大小和每行数据包数

要计算有效负载大小和每行数据包数,请使用以下步骤

  1. 按如下方式计算行步幅:

    line stride = (width * pgroup size) / pgroup coverage
    
  2. 将此步幅划分为具有相等字节数的多个数据包。这将是每行数据包的值。

  3. 在步骤 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 的两种实现 - udpsinknvdsudpsinknvdsudpsink 组件只能与 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
Gst-nvdsudpsrc

输入和输出#

  • 输入

    • 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

  • 输出

特性#

下表总结了插件的特性。

Gst-nvdsudpsink 插件特性#

特性

描述

发布版本

支持 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 属性。

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