我不确定我所问的是否可行或者具有功能性,但是我正在尝试以有序但是“按需”的方式从视频中加载帧。
基本上现在我是通过使用 stdout
管道将整个未压缩的视频读入缓冲区中,例如:
H, W = 1080, 1920 # video dimensions
video = '/path/to/video.mp4' # path to video
# ffmpeg command
command = [ "ffmpeg",
'-i', video,
'-pix_fmt', 'rgb24',
'-f', 'rawvideo',
'pipe:1' ]
# run ffmpeg and load all frames into numpy array (num_frames, H, W, 3)
pipe = subprocess.run(command, stdout=subprocess.PIPE, bufsize=10**8)
video = np.frombuffer(pipe.stdout, dtype=np.uint8).reshape(-1, H, W, 3)
# or alternatively load individual frames in a loop
nb_img = H*W*3 # H * W * 3 channels * 1-byte/channel
for i in range(0, len(pipe.stdout), nb_img):
img = np.frombuffer(pipe.stdout, dtype=np.uint8, count=nb_img, offset=i).reshape(H, W, 3)
我想知道是否有可能在Python中完成同样的过程,但是不需要先将整个视频加载到内存中。 我脑海中的想象是:
- 打开一个缓冲区
- 按需在内存位置上寻找
- 将帧加载到numpy数组中
我知道还有其他库,例如OpenCV,可以实现相同的行为,但我想知道:
- 使用此类ffmpeg管道到numpy数组操作是否有效率?
- 这是否会破坏直接使用ffmpeg而非通过OpenCV进行寻找/加载或首先提取帧然后加载单个文件的加速优势?
ffmpeg
寻找速度过慢有关?如果这是问题,目前寻找需要多长时间?您的视频长度是多少秒和fps?在加载其他视频之前,您通常会花费多长时间来处理它们?我试图理解您真正想要优化的内容以及如何通过更多的RAM、更多的磁盘、更好的数据结构来进行权衡以实现它。 - Mark Setchell