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 函數設定。
警告
在不久的將來,我們計劃將 PyTorch 的影片解碼功能集中在 torchcodec 專案中。我們鼓勵您試用並分享您的意見回饋,因為 torchvision 影片解碼器最終將會被棄用。
警告
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 (字串、位元組物件或 張量) – 媒體來源。如果為字串類型,則必須是 FFMPEG 支援的檔案路徑。如果為位元組,則應為 FFMPEG 支援的檔案的記憶體內表示法。如果為張量,則在內部解譯為位元組緩衝區。它必須是一維的,類型為
torch.uint8
。stream (字串,選用) – 所需串流的描述符,後跟串流 ID,格式為
{stream_type}:{stream_id}
。預設為"video:0"
。目前可用的選項包括['video'、 'audio']
num_threads (int,選用) – Codec 用於解碼影片的執行緒數。預設值 (0) 啟用多執行緒,並使用 Codec 相依的啟發式方法。效能將取決於支援的 FFMPEG Codec 版本。
使用
VideoReader
的範例- seek(time_s: float, keyframes_only: bool = False) VideoReader [原始碼]¶
在目前的串流中搜尋。
注意
目前的實作是所謂的精確搜尋。這表示在搜尋之後,呼叫
next()
將傳回具有精確時間戳記的影格(如果存在),或時間戳記大於time_s
的第一個影格。