VideoReader¶
- class torchvision.io.VideoReader(src: str, stream: str = 'video', num_threads: int = 0)[源代码]¶
[已弃用] 精细的视频读取 API。支持从单个视频容器的各种流进行逐帧读取。与之前的 video_reader API 类似,它支持以下后端:video_reader、pyav 和 cuda。可以通过 torchvision.set_video_backend 函数设置后端。
警告
已弃用:torchvision 的所有视频解码和编码功能从 0.22 版本开始已弃用,并将在 0.24 版本中移除。我们建议您迁移到 TorchCodec,我们将在其中整合 PyTorch 未来的解码/编码功能。
警告
VideoReader 类处于 Beta 阶段,不保证向后兼容。
示例
以下示例创建了一个
VideoReader
对象,定位到 2 秒处,并返回单个帧import torchvision video_path = "path_to_a_test_video" reader = torchvision.io.VideoReader(video_path, "video") reader.seek(2.0) frame = next(reader)
VideoReader
实现了一个可迭代 API,这使得它适合与itertools
结合使用以进行更高级的读取。因此,我们可以在 for 循环中使用VideoReader
实例。reader.seek(2) for frame in reader: frames.append(frame['data']) # additionally, `seek` implements a fluent API, so we can do for frame in reader.seek(2): frames.append(frame['data'])
使用
itertools
,我们可以通过以下代码读取 2 秒到 5 秒之间的所有帧。for frame in itertools.takewhile(lambda x: x['pts'] <= 5, reader.seek(2)): frames.append(frame['data'])
同样,读取 2 秒时间戳之后的 10 帧可以如下实现:
for frame in itertools.islice(reader.seek(2), 10): frames.append(frame['data'])
注意
每个流描述符由两部分组成:流类型(例如 ‘video’)和唯一的流 ID(由视频编码确定)。这样,如果视频容器包含多个相同类型的流,用户就可以访问他们想要的那个。如果只传递流类型,解码器会自动检测该类型的第一个流。
- 参数:
src (string, bytes object, or tensor) – 媒体源。如果是字符串类型,它必须是 FFMPEG 支持的文件路径。如果是字节类型,应该是 FFMPEG 支持的文件的内存表示。如果是 Tensor,它在内部被解释为字节缓冲区。它必须是一维的,类型为
torch.uint8
。stream (string, optional) – 所需流的描述符,后跟流 ID,格式为
{stream_type}:{stream_id}
。默认为"video:0"
。目前可用的选项包括['video', 'audio']
。num_threads (int, optional) – 编解码器用于解码视频的线程数。默认值(0)启用多线程,具有编解码器依赖的启发式方法。性能将取决于所支持的 FFMPEG 编解码器的版本。
使用
VideoReader
的示例- seek(time_s: float, keyframes_only: bool = False) VideoReader [源代码]¶
在当前流中定位。
注意
当前实现是所谓的精确查找。这意味着在查找之后,调用
next()
将返回具有确切时间戳的帧(如果存在),或者返回第一个时间戳大于time_s
的帧。