Gst-nvdsmetautils#

gst-nvdsmetautils 包含 nvdsmetainsert 和 nvdsmetaextract 插件。以下是每个插件的详细说明、用途和用例。

Gst-nvdsmetainsert#

Gst-nvdsmetainsert 插件是一个 NvDsMeta 实用程序插件,它为单帧/批量音频/视频帧处理提供了一个自定义库挂钩接口。自定义库实现可以具有算法,用于根据用例序列化 NvDsBatchmeta 或在输入缓冲区上接收的自定义 gst 用户元数据。该插件接受批量音频/视频 NVMM HW 缓冲区,并根据用例输出缓冲区上具有序列化元数据的批量音频/视频 NVMM HW 缓冲区。

Gst-nvdsmetainsert

输入和输出#

  • 输入

    • NVMM Gst 缓冲区。

  • 控制参数

    • serialize-lib

  • 输出

    • NVMM Gst 缓冲区,就地操作。

功能#

下表总结了该插件的功能。

Gst-nvdsmetainsert 功能#

功能

描述

发布版本

简化的 API

简化的接口,用于实现自定义库以添加任何算法,而无需实现新的插件

DS 6.1

轻松数据访问

在自定义库内部轻松访问 GstBuffer 及其元数据

DS 6.1

参考实现。

自定义库的参考实现提供了用于解码器、序列化和反序列化 NvDsBatchmeta 的序列化数据的实现。

DS 6.1

customlib_impl 接口#

  • serialize_data => 接受 GstBuffer,序列化输入元数据并将其作为 NvDsUserMeta / gst 元数据附加到同一 GstBuffer 上。

Gst 属性#

下表描述了 Gst-nvdsmetainsert 插件的 Gst 属性。

Gst-nvdsmetainsert gst 属性#

属性

含义

类型和范围

示例/注释

平台

serialize-lib

设置要使用的序列化库名称。

字符串

默认值:null

dGPU

用例和示例管道#

以下是两个参考实现,可以对其进行扩展以适应任何特定用例。

用例 1 - 将 CustomMeta 作为 SEI 数据附加到 H264 中

带有 sei_serialization 库的 nvdsmetainsert 插件作为 DS SDK 6.1 及更高版本的一部分发布,序列化输入元数据并将其作为 gst 元数据附加到同一缓冲区上,nv 编码器将此元数据嵌入到比特流中,类型为 SEI 未注册数据。

以下管道演示了 nvdsvideotemplate 插件生成虚拟边界框,并且此元数据由带有序列化库的 nvdsmetainsert 插件序列化。序列化元数据被 nv 编码器用于将其作为 SEI 未注册数据插入到 H264 比特流中。

export USE_NEW_NVSTREAMMUX=yes

gst-launch-1.0 filesrc location=~/sample_720p.mp4 ! qtdemux ! h264parse \
! nvv4l2decoder ! m.sink_0 nvstreammux name=m ! nvdsvideotemplate dummy-meta-insert=1 \
customlib-name=libcustom_videoimpl.so customlib-props="scale-factor:0.5" \
! nvmultistreamtiler width=640 height=480 ! nvdsmetainsert serialize-lib = "libnvds_sei_serialization.so" \
! nvv4l2h264enc bitrate=1000000 ! filesink location=~/ds_maxine_sei.h264 \
filesrc location=~/sample_720p.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! m.sink_1

用例 2 - 视频 NvDsBatchMeta 序列化

带有 nvds_video_meta_serialization 库的 nvdsmetainsert 插件作为 DS SDK 6.1 及更高版本的一部分发布,序列化 NvDsFrameMeta 和 NvDsObjectMeta 并作为 NvDsUserMeta 附加到同一缓冲区上的 NvDsFrameMeta 内部。

以下管道演示了带有序列化库的 nvdsmetainsert 插件序列化 NvDsFrameMeta 和 NvDsObjectMeta。序列化元数据被 nvdsmetaextract 插件用于反序列化和重新构建 NvDsFrameMeta 和 NvDsObjectMeta。

设置 CLEAR_NVDS_BATCH_META=yes 仅用于演示以下管道,在实际用例场景(如 RDMA 传输)中,不需要此标志。

export CLEAR_NVDS_BATCH_META=yes
export USE_NEW_NVSTREAMMUX=yes

gst-launch-1.0 filesrc location=~/sample_720p.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
! m.sink_0 nvstreammux name=m ! nvvideoconvert ! nvinfer config-file-path= config_infer_primary.txt \
! nvdsmetainsert serialize-lib = "libnvds_video_metadata_serialization.so" \
! nvdsmetaextract deserialize-lib = "libnvds_video_metadata_serialization.so"  \
! nvmultistreamtiler width=1280 height=720 ! nvdsosd !  nveglglessink     filesrc location=~/sample_720p.mp4 \
! qtdemux ! h264parse ! nvv4l2decoder ! m.sink_1

用例 3 - 音频 NvDsBatchMeta 序列化

带有 nvds_audio_meta_serialization 库的 nvdsmetainsert 插件作为 DS SDK 6.1 及更高版本的一部分发布,序列化 NvDsAudioFrameMeta 并作为 NvDsUserMeta 附加到同一缓冲区上的 NvDsAudioFrameMeta 内部。

以下管道演示了带有序列化库的 nvdsmetainsert 插件序列化 NvDsAudioFrameMeta。序列化元数据被 nvdsmetaextract 插件用于反序列化和重新构建 NvDsAudioFrameMeta。

设置 CLEAR_NVDS_BATCH_META=yes 仅用于演示以下管道,在实际用例场景(如 RDMA 传输)中,不需要此标志。

export CLEAR_NVDS_BATCH_META=yes
export USE_NEW_NVSTREAMMUX=yes

gst-launch-1.0 \
filesrc location= ~/noise_44_1k_16bits.wav ! wavparse \
! audioconvert ! audioresample ! "audio/x-raw, rate=(int)44100" ! queue \
! m.sink_0 nvstreammux name=m batch-size=2 ! queue \
! nvinferaudio audio-framesize=44100 audio-hopsize=11025 batch-size=2 \
config-file-path= config_infer_audio_sonyc.txt \
audio-transform="melsdb,fft_length=2560,hop_size=692,dsp_window=hann,num_mels=128,sample_rate=44100,p2db_ref=(float)1.0,p2db_min_power=(float)0.0,p2db_top_db=(float)80.0" \
! nvdsmetainsert serialize-lib = "libnvds_audio_metadata_serialization.so" \
! nvdsmetaextract deserialize-lib = "libnvds_audio_metadata_serialization.so" \
! fakesink                    \
filesrc location= ~/noise_44_1k_16bits.wav ! wavparse \
! audioconvert ! audioresample ! "audio/x-raw, rate=(int)44100" ! m.sink_1

Gst-nvdsmetaextract#

Gst-nvdsmetaextract 插件是一个 NvDsMeta 实用程序插件,它为单帧/批量音频/视频帧处理提供了一个自定义库挂钩接口。自定义库实现可以具有算法,用于根据用例反序列化 NvDsBatchmeta 或在输入缓冲区上接收的自定义 gst 用户元数据。该插件接受批量/非批量音频/视频 NVMM HW 缓冲区,并根据用例输出缓冲区上具有反序列化元数据的批量/非批量音频/视频 NVMM HW 缓冲区。

Gst-nvdsmetaextract

输入和输出#

  • 输入

    • NVMM Gst 缓冲区。

  • 控制参数

    • deserialize-lib

  • 输出

    • NVMM Gst 缓冲区,就地操作。

功能#

下表总结了该插件的功能。

Gst-nvdsmetaextract 功能#

功能

描述

发布版本

简化的 API

简化的接口,用于实现自定义库以添加任何算法,而无需实现新的插件

DS 6.1

轻松数据访问

在自定义库内部轻松访问 GstBuffer 及其元数据

DS 6.1

参考实现。

自定义库的参考实现提供了用于解码器、序列化和反序列化 NvDsBatchmeta 的序列化数据的实现。

DS 6.1

customlib_impl 接口#

  • deserialize_data => 接受 GstBuffer,反序列化输入元数据并将其作为 gst 元数据附加 / 更新同一 GstBuffer 上的现有 NvDsBatchMeta。

Gst 属性#

下表描述了 Gst-nvdsmetaextract 插件的 Gst 属性。

Gst-nvdsmetaextract gst 属性#

属性

含义

类型和范围

示例/注释

平台

deserialize-lib

设置要使用的反序列化库名称。

字符串

默认值:null

dGPU

用例和示例管道#

以下是两个参考实现,可以对其进行扩展以适应任何特定用例。

用例 1:自定义元数据反序列化 H264 中的 SEI

Nv 解码器发送已解析的未注册类型的 SEI 数据,该数据是比特流内部的序列化元数据,带有 sei_serialization 库的 nvdsmetaextract 插件作为 DS SDK 6.1 及更高版本的一部分发布,反序列化此元数据并将其作为 gst 元数据添加到传出缓冲区中,下游插件可以根据用例使用此数据。

以下管道演示了解析比特流中序列化的 SEI 数据,将其作为 Gst 元数据附加到传出缓冲区,并在 nvdsmetaexract 插件中对其进行反序列化

gst-launch-1.0 filesrc location=~/ds_maxine_sei.h264 ! h264parse ! nvv4l2decoder extract-sei-type5-data=1 \
! nvdsmetaextract deserialize-lib=libnvds_sei_serialization.so ! nveglglessink

用例 2:视频 NvDsBatchMeta 反序列化

上游组件发送带有序列化 NvDsFrameMeta 和 NvDsObjectMeta 的 GstBuffer,这些元数据作为 NvDsUserMeta 附加在 NvDsFrameMeta 内部,带有 nvds_video_meta_serialization 库的 nvdsmetaextract 插件作为 DS SDK 6.1 及更高版本的一部分发布,反序列化此 NvDsUserMeta 并重新构建 NvDsFrameMeta 和 NvDsObjectMeta 作为 NvDsBatchMeta 的一部分。

以下管道演示了带有序列化库的 nvdsmetainsert 插件序列化 NvDsFrameMeta 和 NvDsObjectMeta。序列化元数据被 nvdsmetaextract 插件用于反序列化和重新构建 NvDsFrameMeta 和 NvDsObjectMeta。

设置 CLEAR_NVDS_BATCH_META=yes 仅用于演示以下管道,在实际用例场景(如 RDMA 传输)中,不需要此标志。

export CLEAR_NVDS_BATCH_META=yes
export USE_NEW_NVSTREAMMUX=yes

gst-launch-1.0 filesrc location=~/sample_720p.mp4 ! qtdemux ! h264parse ! nvv4l2decoder \
! m.sink_0 nvstreammux name=m ! nvvideoconvert ! nvinfer config-file-path= config_infer_primary.txt \
! nvdsmetainsert serialize-lib = "libnvds_video_metadata_serialization.so" \
! nvdsmetaextract deserialize-lib = "libnvds_video_metadata_serialization.so"  \
! nvmultistreamtiler width=1280 height=720 ! nvdsosd !  nveglglessink     filesrc location=~/sample_720p.mp4 \
! qtdemux ! h264parse ! nvv4l2decoder ! m.sink_1

用例 3 - 音频 NvDsBatchMeta 序列化

上游组件发送带有序列化 NvDsAudioFrameMeta 的 GstBuffer,该元数据作为 NvDsUserMeta 附加在 NvDsAudioFrameMeta 内部,带有 nvds_audio_meta_serialization 库的 nvdsmetaextract 插件作为 DS SDK 6.1 及更高版本的一部分发布,反序列化此 NvDsUserMeta 并重新构建 NvDsAudioFrameMeta 作为 NvDsBatchMeta 的一部分

以下管道演示了带有序列化库的 nvdsmetainsert 插件序列化 NvDsAudioFrameMeta。序列化元数据被 nvdsmetaextract 插件用于反序列化和重新构建 NvDsAudioFrameMeta。

设置 CLEAR_NVDS_BATCH_META=yes 仅用于演示以下管道,在实际用例场景(如 RDMA 传输)中,不需要此标志。

export CLEAR_NVDS_BATCH_META=yes
export USE_NEW_NVSTREAMMUX=yes

gst-launch-1.0 \
filesrc location= ~/noise_44_1k_16bits.wav ! wavparse \
! audioconvert ! audioresample ! "audio/x-raw, rate=(int)44100" ! queue \
! m.sink_0 nvstreammux name=m batch-size=2 ! queue \
! nvinferaudio audio-framesize=44100 audio-hopsize=11025 batch-size=2 \
config-file-path= config_infer_audio_sonyc.txt \
audio-transform="melsdb,fft_length=2560,hop_size=692,dsp_window=hann,num_mels=128,sample_rate=44100,p2db_ref=(float)1.0,p2db_min_power=(float)0.0,p2db_top_db=(float)80.0" \
! nvdsmetainsert serialize-lib = "libnvds_audio_metadata_serialization.so" \
! nvdsmetaextract deserialize-lib = "libnvds_audio_metadata_serialization.so" \
! fakesink                    \
filesrc location= ~/noise_44_1k_16bits.wav ! wavparse \
! audioconvert ! audioresample ! "audio/x-raw, rate=(int)44100" ! m.sink_1