Python:将视频文件加载到内存的最快方法是什么?

时间:2017-07-07 18:33:21

标签: python opencv video ffmpeg

首先是一些背景

我正在尝试编写自己的视频分析工具集,主要用于检测渲染错误,如闪烁帧以及未来可能的其他东西。

(明显的)目标是编写一个脚本,比我实时观看文件更快,更准确。

使用OpenCV,我的内容如下:

import cv2


vid = cv2.VideoCapture("Video/OpenCV_Testfile.mov", cv2.CAP_FFMPEG)
width = 1024
height = 576
length = vid.get(cv2.CAP_PROP_FRAME_COUNT)

for f in range(length):
    blue_values = []
    vid.set(cv2.CAP_PROP_POS_FRAMES, f)
    is_read, frame = vid.read()
    if is_read:
        for row in range(height):
            for col in range(width):
                blue_values.append(frame[row][col][0])
    print(blue_values)
vid.release()

这只会打印出每个帧的所有蓝色值的列表。 - 只是为了简单起见(我的实际脚本比较每帧的几个值,只保存帧数,当所有帧相等时)

虽然这有效,但操作速度不是很快。 (嵌套循环,但最重要的是,必须为每个帧调用read()方法,这是相当慢的。 我尝试使用多处理,但基本上结果与此处描述的崩溃相同:

how to get frames from video in parallel using cv2 & multiprocessing in python

我有一个20多岁的1024x576 @ 25fps Testfile,其执行如下:

  • mov,ProRes: 15s
  • mp4,h.264: 30s (太慢)

我的机器能够使用mplayer(使用ffmpeg解码)以1920x1080 @ 50fps播放h.264。所以,我应该能够从中获得更多。这导致我

我的问题

如何解码视频并简单地将所有像素值转储到列表中以进行进一步(可能是多线程)操作?速度真的非常重要。注意:我并不关注OpenCV。无论什么效果最好。

谢谢!

1 个答案:

答案 0 :(得分:0)

加载文件的一种可能且足够好的方法是创建ramdisk。它避免了巨大的磁盘访问延迟,而是以RAM速度加载。使用以下命令创建ramdisk并将视频文件保存在该目录中。

mkdir /mnt/myramdisk
mount -t tmpfs -o size=512m tmpfs /mnt/myramdisk 

在这里,您可以根据可用的RAM大小给出任何大小而不是512。这里的限制是视频文件不能大于RAM的大小。