视频阅读器¶
- class torchvision.io.VideoReader(src: str, stream: str = 'video', num_threads: int = 0)[source]¶
细粒度的视频读取API。 支持从单个视频容器中逐帧读取各种流。 与之前的video_reader API类似,它支持以下后端:video_reader、pyav和cuda。 后端可以通过torchvision.set_video_backend函数设置。
警告
在不久的将来,我们计划将PyTorch的视频解码功能集中在torchcodec项目中。我们鼓励您尝试并提供反馈,因为torchvision的视频解码器最终将被弃用。
警告
VideoReader 类目前处于测试阶段,不保证向后兼容性。
示例
以下示例创建了一个
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(由视频编码确定)。这样,如果视频容器包含多个相同类型的流,用户可以访问他们想要的那个。如果只传递流类型,解码器会自动检测该类型的第一个流。
- Parameters:
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[source]¶
在当前流中查找。
注意
当前的实现是所谓的精确查找。这意味着在查找之后,调用
next()将返回具有确切时间戳的帧(如果存在),或者返回时间戳大于time_s的第一个帧。
- set_current_stream(stream: str) bool[source]¶
设置当前流。 明确我们正在操作的流。
- Parameters:
stream (string) – 所需流的描述符。默认为
"video:0"当前可用的流类型包括['video', 'audio']。 每个描述符由两部分组成:流类型(例如‘video’)和 唯一的流ID(由视频编码决定)。 通过这种方式,如果视频容器包含多个 相同类型的流,用户可以访问他们想要的那个。 如果只传递流类型,解码器会自动检测该类型的第一个流 并返回它。- Returns:
成功时为真,否则为假
- Return type:
(bool)