nvidia.dali.fn.experimental.inputs.video#

nvidia.dali.fn.experimental.inputs.video(*, affine=True, blocking=False, bytes_per_sample_hint=[0], last_sequence_policy='partial', no_copy=False, preserve=False, sequence_length, device=None, name=None)#

从内存缓冲区流式传输和解码视频。适用于长视频和高分辨率视频。

返回帧序列批次,布局为:(F, H, W, C),其中

  • F - 序列中的帧数,

  • H - 帧的高度,

  • W - 帧的宽度,

  • C - 帧中的通道数。

当在 DALI Pipeline 中使用 fn.inputs.video 操作符时,用户需要使用 Pipeline.feed_input() 提供数据。当操作符被馈送数据时,Pipeline 可以多次运行,并且只要有足够的数据进行解码,fn.inputs.video 操作符将返回连续的序列。当帧的来源(视频文件)耗尽时,用户需要再次调用 feed_input 以向操作符提供下一个视频文件。此操作符具有用于数据的内部队列,因此可以多次调用 feed_input,并且当给定的视频文件结束时,操作符将自动从队列顶部获取下一个视频文件。在没有数据供 fn.inputs.video 运行时运行 pipeline 会导致错误。

此操作符仅接受一个视频作为输入(即 input_batch_size=1),并将返回序列批次。每个输出批次都将具有在 Pipeline 创建期间设置的 max_batch_size 样本。当视频文件中的帧数不允许在批次之间均匀分割帧时,此操作符为给定视频返回的最后一个批次将是部分的,并且此批次中的最后一个序列将使用 last_sequence_policy 参数确定。例如

This is a video that consists of 67 frames (every '-' is a frame):
-------------------------------------------------------------------


User decided that there shall be 5 frames per sequence and
the last_sequence_policy='partial':
-------------------------------------------------------------------
[   ][   ][   ][   ][   ][   ][   ][   ][   ][   ][   ][   ][   ][]
-------------------------------------------------------------------
Since there are not enough frames, the last sequence comprises 2 frames.


The Pipeline has max_batch_size=3, therefore the operator will return
5 batches of sequences.
First 4 batches comprise 3 sequences and the last batch is partial and
comprises 2 sequences.
---------------   ---------------   ---------------   ---------------   -------
[   ][   ][   ]   [   ][   ][   ]   [   ][   ][   ]   [   ][   ][   ]   [   ][]
---------------   ---------------   ---------------   ---------------   -------


With the last_sequence_policy='pad', the last sequence of the last batch
will be padded with 0:
---------------   ---------------   ---------------   ---------------   -------000
[   ][   ][   ]   [   ][   ][   ]   [   ][   ][   ]   [   ][   ][   ]   [   ][   ]
---------------   ---------------   ---------------   ---------------   -------000

fn.inputs.videofn.readers.video 之间的区别在于,前者从内存读取编码视频,而后者从磁盘读取编码视频。

fn.inputs.videofn.decoders.video 之间的区别在于,前者不会一次性解码整个视频文件。这种行为对于较长的视频是必需的。例如,5 分钟、4k、30fps 解码视频大约需要 1.7 TB 的内存。

此操作符接受大多数视频容器和文件格式。FFmpeg 用于解析视频容器。在容器不包含所需元数据(例如,帧大小、帧数等)的情况下,操作符需要自行查找,这可能会导致速度减慢。

支持的后端
  • ‘cpu’

  • ‘mixed’

关键字参数:
  • affine (bool, optional, default = True) –

    仅适用于混合后端类型。如果设置为 True,则内部线程池中的每个线程都将绑定到特定的 CPU 核心。

    否则,操作系统可以将线程重新分配给任何 CPU 核心。

  • blocking (bool, optional, default = False) – 高级 如果 True,则此操作符将阻塞,直到数据可用(例如,通过调用 feed_input)。如果 False,则如果数据不可用,操作符将引发错误。

  • bytes_per_sample_hint (int or list of int, optional, default = [0]) –

    输出大小提示,以字节/样本为单位。

    如果指定,则位于 GPU 或页锁定主机内存中的操作符输出将预先分配,以容纳此大小的样本批次。

  • last_sequence_policy (str, optional, default = ‘partial’) –

    指定如何处理视频文件中的最后一个序列。

    对于视频文件中的给定帧数和 frames_per_sequence 参数,可能会发生视频无法在序列之间均匀分割的情况。如果 last_sequence_policy='partial',则最后一个序列的帧数可能少于指定的 frames_per_sequence 值。如果 last_sequence_policy='partial',则最后一个序列将始终具有 frames_per_sequence 帧,并将填充空帧。

    允许的值为 'partial''pad'

  • no_copy (bool, optional, default = False) –

    确定在调用 feed_input 时 DALI 是否应复制缓冲区。

    如果设置为 True,DALI 会将用户的内存直接传递给 pipeline,而不是复制它。用户有责任保持缓冲区处于活动状态且未修改,直到 pipeline 使用它为止。

    在相关迭代的输出被使用后,可以再次修改或释放缓冲区。实际上,它发生在 prefetch_queue_depthcpu_queue_depth * gpu_queue_depth (当它们不相等时)迭代之后,紧随 feed_input 调用之后。

    内存位置必须与操作符的指定 device 参数匹配。对于 CPU,提供的内存可以是一个连续的缓冲区或连续张量列表。对于 GPU,为避免额外的复制,提供的缓冲区必须是连续的。如果提供单独张量的列表,则会在内部进行额外的复制,从而消耗内存和带宽。

  • preserve (bool, optional, default = False) – 阻止操作符从图中删除,即使其输出未使用。

  • sequence_length (int) – 每个序列中的帧数。