什么是 Deepstream Service Maker 插件#
插件封装了一个专门的工厂,可以通过标准化的工厂 API 创建用户实现的自定义对象。用户可以灵活地在插件中定义一个带有描述性元数据的工厂,包括名称、版本、描述等,用于他们的自定义对象。通过加载插件,任何应用程序都可以通过通用的工厂 API 创建自定义对象的实例,并促进用户定义的自定义对象(例如,对象计数器、延迟测量等)在多个应用程序之间的无缝重用。
工厂和插件入门#
在封装工厂之前,必须先构思出工厂将创建的自定义对象。作为一个说明性示例,让我们考虑一个简单的延迟测量探针。通过为 BufferProbe 实现 IBufferObserver 接口,我们将其定制为视频帧的延迟测量工具
class MeasureLatency : public BufferProbe::IBufferObserver {
public:
virtual probeReturn handleBuffer(BufferProbe& probe, const Buffer& buffer) {
auto latency_info = buffer.measureLatency();
for (auto& latency : latency_info) {
cout << "Source id = " << latency.source_id
<< " Frame_num = " << latency.frame_num
<< " Frame latency = " << latency.latency << " (ms)"
<< endl;
}
return probeReturn::Probe_Ok;
}
};
接下来,您需要在插件中封装此延迟测量探针的工厂。为了实现这一点,我们可以使用 plugin.h 文件中的宏来分别定义工厂和插件
DS_CUSTOM_PLUGIN_DEFINE(measure_latency_probe, "Custom probe to add measure Latency", "0.1", "Proprietary")
// define a factory that creates a BufferProbe instance with a MeasureLatency implementation
DS_CUSTOM_FACTORY_DEFINE(
"measure_latency_probe",
"Latency measurement calculating custom probe factory",
"probe",
"this is a latency measurement custom probe factory",
"NVIDIA",
BufferProbe,
MeasureLatency
)
要构建插件,您需要创建一个包含以下内容的简单 CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.16)
project(Sample)
find_package(nvds_c++ REQUIRED PATHS /opt/nvidia/deepstream/deepstream/service-maker/cmake)
add_library(measure_latency_probe SHARED measure_latency_probe.cpp)
target_link_libraries(measure_latency_probe PRIVATE nvds_service_maker nvds_service_maker_utils)
$ mkdir build && cd build && cmake .. && make
成功完成插件构建过程后,您可以在任何应用程序中无缝使用我们定制的延迟测量 BufferProbe
pipeline.attach("decoder", "measurelatencyprobe", "my probe", "src")
将属性合并到插件中#
为了进一步提高工厂重用的多功能性,我们可以为工厂中的对象引入属性规范。用于向工厂添加属性规范的宏可以按如下方式使用
DS_CUSTOM_FACTORY_DEFINE_PARAMS_BEGIN(probe_param_spec)
DS_CUSTOM_FACTORY_DEFINE_PARAM(source-id, integer, "source-id", "sourceid", 0)
DS_CUSTOM_FACTORY_DEFINE_PARAMS_END
在延迟测量实现中,帧延迟的计算可以限定在指定的流中
class MeasureLatency : public BufferProbe::IBufferObserver {
public:
virtual probeReturn handleBuffer(BufferProbe& probe, const Buffer& buffer) {
int id = 0;
probe.getProperty("source-size", id);
auto latency_info = buffer.measureLatency();
for (auto& latency : latency_info) {
if (latency.source_id == id) {
cout << "Source id = " << latency.source_id
<< " Frame_num = " << latency.frame_num
<< " Frame latency = " << latency.latency << " (ms)"
<< endl;
}
}
return probeReturn::Probe_Ok;
}
};
在应用程序中,您可以选择指定用于延迟测量的精确源 ID
pipeline.attach("decoder", "measurelatencyprobe", "my probe", "src", "source-id", 1)
示例插件#
示例插件可以从 Deepstream 安装目录 /opt/nvidia/deepstream/deepstream/service-maker/sources/modules
中找到,用户可以使用以下命令构建它们
$ cmake /opt/nvidia/deepstream/deepstream/service-maker/sources/modules/sample_video_probe && make
消息元数据生成器#
消息元数据生成器是一个示例插件,它创建一个缓冲区探针来生成事件消息元数据。下游 nvmsgconv 可以使用此元数据来创建 JSON 有效负载,以便传输到 Kafka 等消息代理。
插件的注册名称为“add_message_meta_probe”。
KITTI Dump 插件#
KITTI Dump 插件是一个示例插件,它创建一个缓冲区探针,将对象元数据转储到 kitti 格式的 txt 文件中。插件的注册名称为“ktti_dump_probe”。
支持以下参数
kitti-dir:用于保存 kitti 文件的路径(默认值:/tmp/kitti)。
帧率测量插件#
帧率测量插件是一个示例插件,它创建一个帧率测量探针,用于测量和打印当前帧率。插件的注册名称为“measure_fps_probe”。
延迟测量插件#
延迟测量插件是一个示例插件,它创建一个延迟测量探针,用于测量和打印当前帧延迟。插件的注册名称为“measure_latency_probe”。
示例视频探针插件#
此插件创建一个示例视频探针,该探针构建显示元数据,供下游 osd 插件显示对象计数器。插件的注册名称为“sample_video_probe”。以下参数受支持,用于自定义创建的缓冲区探针对象
font-size:用于指定字体大小的整数。
示例信号处理程序插件#
此插件创建示例信号处理程序,以响应来自 nvinfer 插件的“model-updated”信号。作为一个示例,每当模型更新时,它都会打印出消息。插件的注册名称为“sample_signal_handler”。
示例视频馈送器插件#
此插件创建一个示例视频馈送器,可以附加到“appsrc”,从而从文件向管道注入原始视频数据。插件的注册名称为“sample_video_feeder”。以下参数受支持,用于自定义创建的缓冲区探针对象
location:一个字符串,用于指定文件作为视频数据源
frame-width:视频帧的宽度
frame-height:视频帧的高度
format:视频帧的格式,可以是 RGBA、I420 和 NV12 之一
use-gpu-memory:如果为 True,则将数据复制到 GPU 内存中
use-external-memory:如果为 True,则在管道外部分配内存。
示例视频接收器插件#
此插件创建一个示例视频接收器,用于演示如何从“appsink”检索缓冲区数据。插件的注册名称为“sample_video_receiver”。
智能录制操作插件#
此插件创建一个信号发射器对象,可以附加到“nvurisrcbin”以触发智能录制并暂停它。作为一个示例插件,它与远程 Kafka 服务器交互,并根据从 Kafka 服务器接收的消息控制智能录制。
插件的注册名称为“smart_recording_action”。以下参数受支持,用于自定义创建的缓冲区探针对象
proto-lib:实现设备/云通信协议的共享库的路径
conn-str:连接字符串,格式为“ip;port”
proto-config-file:通信协议的配置文件路径
msgconv-config-file:消息转换器配置文件路径
topic-list:要订阅的主题列表
智能录制信号插件#
此插件创建一个示例智能录制信号处理程序,以简要打印响应来自“nvurisrcbin”的“sr-done”信号。插件的注册名称为“smart_recording_signal”。
插件搜索路径#
默认情况下,插件将从安装路径 /opt/nvidia/deepstream/deepstream/service-maker/sources/modules
中搜索。但是,用户可以通过在 NVDS_MODULE_PATH 环境变量中定义路径来指定自己的路径,多个路径可以用“:”分隔。