如何使用Python解码库按时间戳而不是按帧索引进行搜索



Decord允许使用索引从文件中查找视频帧,如:

video_reader = decord.VideoReader(video_path)
frames = video_reader.get_batch(indices)

如果我有时间戳(单位是秒(,我怎么能做同样的事情?

您可以获得每帧的时间戳(平均其开始和结束时间(,然后找到最接近的时间戳:

from typing import Sequence, Union
import decord
import numpy as np

def time_to_indices(video_reader: decord.VideoReader, time: Union[float, Sequence[float]]) -> np.ndarray:
times = video_reader.get_frame_timestamp(range(len(video_reader))).mean(-1)
indices = np.searchsorted(times, time)
# Use `np.bitwise_or` so it works both with scalars and numpy arrays.
return np.where(np.bitwise_or(indices == 0, times[indices] - time <= time - times[indices - 1]), indices,
indices - 1)
frames = video_reader.get_batch(time_to_indices(indices))

请注意,VideoReaderC对象(不是Python对象(已经加载了初始化后的所有帧时间戳。我们利用了这样一个事实,即它们应该被分类。

PyTrochVideo使用decod作为其视频解码后端,并提供时间戳读取:

from pytorchvideo.data.encoded_video import EncodedVideo
start_sec = 0
end_sec = start_sec + clip_duration
video = EncodedVideo.from_path(video_path)
video_data = video.get_clip(start_sec=start_sec, end_sec=end_sec)

教程位于https://pytorchvideo.org/docs/tutorial_torchhub_inference

最新更新