我正在尝试编写自己的视频分析工具集,主要用于检测渲染错误,如闪烁帧以及未来可能的其他东西。
(明显的)目标是编写一个脚本,比我实时观看文件更快,更准确。
使用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,其执行如下:
我的机器能够使用mplayer(使用ffmpeg解码)以1920x1080 @ 50fps播放h.264。所以,我应该能够从中获得更多。这导致我
如何解码视频并简单地将所有像素值转储到列表中以进行进一步(可能是多线程)操作?速度真的非常重要。注意:我并不关注OpenCV。无论什么效果最好。
谢谢!
答案 0 :(得分:0)
加载文件的一种可能且足够好的方法是创建ramdisk。它避免了巨大的磁盘访问延迟,而是以RAM速度加载。使用以下命令创建ramdisk并将视频文件保存在该目录中。
mkdir /mnt/myramdisk
mount -t tmpfs -o size=512m tmpfs /mnt/myramdisk
在这里,您可以根据可用的RAM大小给出任何大小而不是512。这里的限制是视频文件不能大于RAM的大小。