智能视频录制#

智能视频录制用于基于事件(本地或云端)录制原始数据流。仅录制包含重要事件的数据流,而不是始终保存整个数据流。此录制与在数据流上运行的推理管线并行进行。维护视频缓存,以便录制的视频包含事件发生前后的帧。视频缓存的大小可以根据用例进行配置。

在智能录制中,编码帧被缓存以节省 CPU 内存。基于事件,这些缓存的帧被封装在选定的容器下以生成录制的视频。这意味着,在有 I 帧之前无法开始录制。缓存中的第一帧可能不是 I 帧,因此,会丢弃缓存中的一些帧以满足此条件。这导致生成的视频时长小于指定的值。

下图显示了智能录制架构

Smart Video Record Architecture

从 DeepStream 6.0 开始,智能录制也支持音频。它使用与视频相同的缓存参数和实现。要启用音频,必须将生成编码音频比特流的 GStreamer 元素链接到智能录制 bin 的 asink pad。音频和视频都将被录制到同一个容器化文件中。有关使用详情,请参阅 deepstream-testsr 示例应用程序。

智能视频录制模块 API#

此模块提供以下 API。有关更多详细信息,请参阅 gst-nvdssr.h 头文件。

  • NvDsSRStatus NvDsSRCreate (NvDsSRContext **ctx, NvDsSRInitParams *params);
    • 此函数创建智能录制实例并返回指向已分配的 NvDsSRContext 的指针。params 结构必须填充创建实例所需的初始化参数。

    • 可以设置回调函数以在录制停止后获取录制的音频/视频信息。在该回调中收到的 userData 是在 NvDsSRStart() 期间传递的。

    • GstBin (即 NvDsSRContextrecordbin) 必须添加到管线中。它期望编码帧,这些帧将被 muxed 并保存到文件中。将此 bin 添加到管线中音频/视频解析器元素之后。

    • 调用 NvDsSRDestroy() 以释放此函数分配的资源。

  • NvDsSRStatus NvDsSRStart (NvDsSRContext *ctx, NvDsSRSessionId *sessionId, guint startTime, guint duration, gpointer userData);
    • 此函数开始将缓存的音频/视频数据写入文件。它返回会话 ID,该 ID 稍后可在 NvDsSRStop() 中用于停止相应的录制。

    • 此处 startTime 指定当前时间之前的秒数,duration 指定录制开始后的秒数。

    • 如果当前时间为 t1,则 从 t1 - startTime 到 t1 + duration 的内容 将被保存到文件中。因此,总共将录制 startTime + duration 秒 的数据。如果 duration 设置为零,则录制将在 NvDsSRCreate() 中设置的 defaultDuration 秒后停止。

    • 回调函数期间需要的任何数据都可以作为 userData 传递。

  • NvDsSRStatus NvDsSRStop (NvDsSRContext *ctx, NvDsSRSessionId sessionId);
    • 此函数停止先前开始的录制。

  • NvDsSRStatus NvDsSRDestroy (NvDsSRContext *ctx);
    • 此函数释放先前由 NvDsSRCreate() 分配的资源。

有关使用此模块的更多详细信息,请参阅 deepstream_source_bin.c

智能视频录制配置#

在现有的 deepstream-test5-app 中,仅 RTSP 源启用了智能录制。可以通过两种方式生成智能录制事件 – 通过本地事件或通过云消息。要在 deepstream-test5-app 中启用智能录制,请在 [sourceX] 组下设置以下内容

  • smart-record=<1/2>

要仅通过云消息启用智能录制,请设置 smart-record=1 并相应地配置 [message-consumerX] 组。预计来自服务器的以下最小 json 消息将触发智能录制的 Start/Stop

 {
  command: string   // <start-recording / stop-recording>
  start: string     // "2020-05-18T20:02:00.051Z"
  end: string       // "2020-05-18T20:02:02.851Z",
  sensor: {
  id: string
 }
}

如果设置 smart-record=2,这将通过云消息以及具有默认配置的本地事件启用智能录制。这意味着智能录制 Start/Stop 事件每 10 秒通过本地事件生成。以下是配置参数的默认值

cache size = 30 seconds,
container = MP4,
default duration = 10 seconds,
interval = 10 seconds,
file prefix = Smart_Record etc.

以下字段可以在 [sourceX] 组下用于配置这些参数。

  • smart-rec-cache=<val in seconds> 缓存大小,单位为秒。此参数将增加应用程序的总体内存使用量。

  • smart-rec-duration=<val in seconds> 录制时长。

  • smart-rec-start-time=<val in seconds> 此处,录制的开始时间是开始录制时比当前时间早的秒数。例如,如果 t0 是当前时间,N 是开始时间(秒),则表示录制将从 t0 – N 开始。为了使其工作,缓存大小必须大于 N。

  • smart-rec-default-duration=<val in seconds> 如果未生成停止事件。此参数将确保录制在预定义的默认时长后停止。

  • Smart-rec-container=<0/1> 支持 MP4 和 MKV 容器。

  • smart-rec-interval=<val in seconds> 这是 SR 启动/停止事件生成的时间间隔,单位为秒。在 deepstream-test5-app 中,为了演示用例,智能录制启动/停止事件每间隔秒生成一次。

  • smart-rec-file-prefix=<file name prefix> 生成的流的文件名前缀。默认情况下,如果未设置此字段,则前缀为“Smart_Record”。对于唯一名称,每个源都必须提供唯一的前缀。

  • smart-rec-dir-path=<path of directory to save the file> 用于保存录制文件的目录路径。默认情况下,使用当前目录。

录制也可以由从云端接收的 JSON 消息触发。消息格式如下

{
command: string   // <start-recording / stop-recording>
start: string     // "2020-05-18T20:02:00.051Z"
end: string       // "2020-05-18T20:02:02.851Z",
sensor: {
id: string
}
}

deepstream-test5 示例应用程序中演示了接收和处理来自云端的此类消息。目前 Kafka 支持此功能。要激活此功能,请在应用程序配置文件中填充并启用以下块

# Configure this group to enable cloud message consumer.
[message-consumer0]
enable=1
proto-lib=/opt/nvidia/deepstream/deepstream/lib/libnvds_kafka_proto.so
conn-str=<host>;<port>
config-file=<broker config file e.g. cfg_kafka.txt>
subscribe-topic-list=<topic1>;<topic2>;<topicN>
# Use this option if message has sensor name as id instead of index (0,1,2 etc.).
#sensor-list-file=dstest5_msgconv_sample_config.txt

当应用程序运行时,使用 Kafka 代理在 subscribe-topic-list 中的主题上发布上述 JSON 消息,以启动和停止录制。

注意

目前,不支持重叠智能录制。