智能视频录制#
智能视频录制用于基于事件(本地或云端)录制原始数据流。仅录制包含重要事件的数据流,而不是始终保存整个数据流。此录制与在数据流上运行的推理管线并行进行。维护视频缓存,以便录制的视频包含事件发生前后的帧。视频缓存的大小可以根据用例进行配置。
在智能录制中,编码帧被缓存以节省 CPU 内存。基于事件,这些缓存的帧被封装在选定的容器下以生成录制的视频。这意味着,在有 I 帧之前无法开始录制。缓存中的第一帧可能不是 I 帧,因此,会丢弃缓存中的一些帧以满足此条件。这导致生成的视频时长小于指定的值。
下图显示了智能录制架构
从 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
(即NvDsSRContext
的recordbin
) 必须添加到管线中。它期望编码帧,这些帧将被 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 消息,以启动和停止录制。
注意
目前,不支持重叠智能录制。