什么是 Deepstream Service Maker 插件#

插件封装了一个专门的工厂,可以通过标准化的工厂 API 创建用户实现的自定义对象。用户可以灵活地在插件中定义一个带有描述性元数据的工厂,包括名称、版本、描述等,用于他们的自定义对象。通过加载插件,任何应用程序都可以通过通用的工厂 API 创建自定义对象的实例,并促进用户定义的自定义对象(例如,对象计数器、延迟测量等)在多个应用程序之间的无缝重用。

Deepstream Service Maker Module

工厂和插件入门#

在封装工厂之前,必须先构思出工厂将创建的自定义对象。作为一个说明性示例,让我们考虑一个简单的延迟测量探针。通过为 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 环境变量中定义路径来指定自己的路径,多个路径可以用“:”分隔。