数据流组件
nvarguscamerasrc->capsfilter->nvstreammux->nvinfer->nvvideoconvert->nvdsosd->capsfilter->nvv412h264enc->h264parse->rtph264pay->udpsink
数据流描述了使用 NVIDIA DeepStream SDK 构建的视频处理管道,用于从 NVIDIA 相机模块(通常是 CSI 相机)获取视频流,进行实时推断,并将推理结果叠加在视频上,最终将处理后的视频流以 H.264 编码的 RTP 包发送到指定的 UDP 目的地。
具体各个组件的含义如下:
nvarguscamerasrc: 从 NVIDIA 相机模块捕获视频流。
capsfilter: 设置视频流的格式和属性。
nvstreammux: 将多路视频流合并成一路。
nvinfer: 使用深度学习模型进行推断,例如目标检测、人脸识别等。
nvvideoconvert: 视频格式转换,通常用于将原始视频流转换为推断模型所需的格式。
nvdsosd: 在视频上叠加推断结果,如检测框、标签等。
capsfilter: 设置处理后视频流的格式和属性。
nvv412h264enc: 将视频流编码为 H.264 格式。
h264parse: 对 H.264 码流进行解析。
rtph264pay: 将 H.264 码流打包成 RTP 包。
udpsink: 将打包好的 RTP 数据通过 UDP 发送到指定的网络地址。
这种数据流通常用于视频流的实时处理与传输,适用于视频分析、实时监控等场景。在这个数据流中,视频源经过多个处理步骤,包括推断、叠加标记、编码和打包,最终通过 UDP 发送到其他设备或应用程序进行显示或存储。
元素链接对应
sinkpad=streammux.get_request_pad("sink_0")
srcpad=caps.getstatic_pad("src")
#element连接element
camerasrc.link(caps)
#pad连接pad
srcpad.link(sinkpad)
这段代码是针对 GStreamer 管道中的元素和 pad 进行连接的操作。让我们逐行解释其含义:
sinkpad=streammux.get_request_pad(“sink_0”)
这行代码通过 get_request_pad() 方法从名称为 “sink_0” 的 pad 中获取一个请求 pad,并将其存储在 sinkpad 变量中。通常在多个源同时输入到一个元素时会用到请求 pad。
静态 pad 和请求 pad
在 GStreamer 中,有两种类型的 pad:静态 pad 和请求 pad。
静态 pad 是预先存在的 pad,通常表示元素的输入或输出。对于某些元素来说,其 pad 在创建时就已经确定是输入或输出 pad,称为静态 pad。
请求 pad 是动态创建的 pad,它通常用于接收其他元素的连接请求。当需要将一个元素连接到另一个元素时,可以使用 get_request_pad() 方法从目标元素中请求一个 pad,然后将这个 pad 与其他元素的 pad 进行连接,实现元素之间的数据传输。
在上面提到的示例代码中,streammux.get_request_pad(“sink_0”) 就是在向合流器元素请求一个名为 “sink_0” 的输入 pad,用于连接其他元素的输出。这种动态请求 pad 的机制使得 GStreamer 可以在运行时动态地构建数据流处理管道,更加灵活和具有扩展性。
srcpad=caps.get_static_pad(“src”)
这行代码从 caps 元素的 “src” pad 中获取一个静态 pad,并将其存储在 srcpad 变量中。caps 元素通常用于设置和限定媒体流的格式和属性。
camerasrc.link(caps)
这行代码将 camerasrc 元素(摄像头源)和 caps 元素(媒体流属性设置)连接起来,使摄像头源的输出连接到属性设置元素的输入,以确保视频流的格式和属性设置正确。
srcpad.link(sinkpad)
这行代码将 caps 元素的输出 pad 和之前获取的 streammux 元素的请求 pad 进行连接,即将属性设置元素的输出与合流器元素的输入连接起来,使视频流能够正确传递到合流器中的指定输入通道。
这些操作共同实现了 GStreamer 管道中不同元素(element)和 pad 之间的连接,确保视频流在各个处理步骤中正确地流动和传递。
在创建元素时添加静态输入及输出pad:
# 创建一个元素
element = Gst.ElementFactory.make("videoscale", "videoscale")
# 添加静态输入 pad
pad_template = element.get_pad_template("sink")
pad = element.request_pad(pad_template, None, None)
if pad is None:
print("Failed to create input pad")
else:
print("Input pad created successfully")
# 添加静态输出 pad
pad_template = element.get_pad_template("src")
pad = element.request_pad(pad_template, None, None)
if pad is None:
print("Failed to create output pad")
else:
print("Output pad created successfully")
在 GStreamer 中,request_pad() 函数用于请求一个输入或输出 pad。其函数原型如下:
request_pad(pad_template, name, caps)
这个函数接受三个参数:
pad_template: 表示要请求的 pad 的模板。可以使用 get_pad_template() 方法从元素中获取一个 pad 模板。
name: 可选参数,表示请求 pad 的名称。如果为 None,GStreamer 将会自动生成一个唯一的名称。
caps: 可选参数,表示请求 pad 的媒体类型。可以使用 GStreamer Caps 格式来描述媒体类型,比如指定视频流格式等。
推理nvinfer
pgie=Gst.ElementFactory.make("nvinfer","primary-inference")
pgie.set_property("config-file-path","config.txt")
“nvinfer”: 是要创建的元素的类型或名称。在这里,“nvinfer” 表示创建一个用于推理的 NVIDIA 深度学习推理插件。
“primary-inference”: 是创建的这个元素的实例名称。在 GStreamer 中,每个元素都有一个唯一的实例名称,可以用来引用这个特定的实例。
nvinfer插件将得到的信息写入进元数据中,由nvdsosd提取元数据信息,绘制到图片上来。
数据组件中的nvdsosd要求输入为rgba格式,故需要使用nvvideoconvert进行转换操作。