VideoReader¶
- 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 函式設定後端。
警告
已棄用: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, 或 tensor) – 媒體源。如果是字串型別,必須是 FFMPEG 支援的檔案路徑。如果是位元組型別,應為 FFMPEG 支援的檔案在記憶體中的表示。如果是 Tensor,則在內部被解釋為位元組緩衝區。它必須是一維的,型別為
torch.uint8。stream (string, 可選) – 所需流的描述符,後跟流 ID,格式為
{stream_type}:{stream_id}。預設為"video:0"。目前可用的選項包括['video', 'audio']。num_threads (int, 可選) – 編解碼器用於解碼影片的執行緒數。預設值 (0) 根據編解碼器啟發式啟用多執行緒。效能將取決於支援的 FFMPEG 編解碼器版本。
使用
VideoReader的示例- seek(time_s: float, keyframes_only: bool = False) VideoReader[source]¶
在當前流中定位。
注意
當前的實現是所謂的精確定位 (precise seek)。這意味著定位後,呼叫
next()將返回具有精確時間戳的幀(如果存在),或者返回時間戳大於time_s的第一幀。