ffmpeg - 在内存而不是磁盘中输出图像
ffmpeg - output images in memory instead of disk
我有一个 python 脚本,基本上可以将视频转换为图像并将它们存储在文件夹中,然后读取所有这些图像并从中提取信息,然后删除图像。由于写入图像的步骤太慢而且显然对我需要的东西毫无用处,我想以某种方式将图像存储在内存中而不是磁盘中,从那里读取这些图像并进行操作,这会大大加快我的过程。
现在我的代码如下所示:
第一步:
ffmpeg -i myvideo.avi -r 1 -f image2 C:\img_temp
第二步:
for i in range(1, len(os.listdir(IMGTEMP)):
#My operations for each image
第三步:
for image in os.listdir(IMGTEMP):
os.remove(IMGTEMP + "\" + image)
简短的版本是您可以使用 ramdisk 或 tmpfs 或类似的东西,以便文件确实存储在内存中。不过,我想知道你的 "operations for each image"。你真的需要他们的图像文件吗?如果您所做的只是读取它们的大小,那么为什么还需要一个图像(带有 compression/decompression 等)开销呢?为什么不直接使用 FFmpeg API,读取 AVI 文件,解码帧,然后直接对解码数据进行度量?
看看PyAV. (There is documentation,但比较稀疏。)
看来您可以只打开视频,然后遍历帧。
与MoviePy:
import moviepy.editor as mpy
clip = mpy.VideoFileClip("video.avi")
for frame in clip.iter_frames():
# do something with the frame (a HxWx3 numpy array)
我有一个 python 脚本,基本上可以将视频转换为图像并将它们存储在文件夹中,然后读取所有这些图像并从中提取信息,然后删除图像。由于写入图像的步骤太慢而且显然对我需要的东西毫无用处,我想以某种方式将图像存储在内存中而不是磁盘中,从那里读取这些图像并进行操作,这会大大加快我的过程。
现在我的代码如下所示: 第一步:
ffmpeg -i myvideo.avi -r 1 -f image2 C:\img_temp
第二步:
for i in range(1, len(os.listdir(IMGTEMP)):
#My operations for each image
第三步:
for image in os.listdir(IMGTEMP):
os.remove(IMGTEMP + "\" + image)
简短的版本是您可以使用 ramdisk 或 tmpfs 或类似的东西,以便文件确实存储在内存中。不过,我想知道你的 "operations for each image"。你真的需要他们的图像文件吗?如果您所做的只是读取它们的大小,那么为什么还需要一个图像(带有 compression/decompression 等)开销呢?为什么不直接使用 FFmpeg API,读取 AVI 文件,解码帧,然后直接对解码数据进行度量?
看看PyAV. (There is documentation,但比较稀疏。)
看来您可以只打开视频,然后遍历帧。
与MoviePy:
import moviepy.editor as mpy
clip = mpy.VideoFileClip("video.avi")
for frame in clip.iter_frames():
# do something with the frame (a HxWx3 numpy array)