【问题标题】:ffmpeg - output images in memory instead of diskffmpeg - 在内存而不是磁盘中输出图像
【发布时间】:2015-08-06 06:53:45
【问题描述】:

我有一个 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)

【问题讨论】:

    标签: python ffmpeg pipe disk


    【解决方案1】:

    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)
    

    【讨论】:

    • 令人惊讶,它似乎有效!只有 2 个问题,当我有 64 位系统时,为什么 imageio 需要并下载 ffmpeg 32 位?有没有办法控制要选择的框架?就像在 ffmpeg 中我可以使用 -r 1 每秒选择 1 帧一样,我想在 MoviePy 中做同样的事情。
    • 我不了解 imageio,它看起来像是一种不受欢迎的行为,可能会在项目页面中打开一个问题。对于 fps,只需编写 clip.iter_frames(fps=1)
    • 发生了一些奇怪的事情。当我现在尝试运行脚本时,我收到错误“import moviepy.editor as mpy, ImportError: No module named editor”。有趣的是我什么都没做,moviepy 还是安装了,脚本还是一样的。
    【解决方案2】:

    简短的版本是您可以使用 ramdisk 或tmpfs 或类似的东西,以便文件确实存储在内存中。但是,我想知道您的“每个图像的操作”。你真的需要他们的图像文件吗?如果您所做的只是读取它们的大小,那么您为什么需要一个图像(带有压缩/解压缩等)开销?为什么不直接使用 FFmpeg API、读取 AVI 文件、解码帧并直接对解码后的数据进行度量?

    【讨论】:

    • 我使用imagehash 库计算图像的哈希值,该库需要对实际图像进行一些操作(调整大小、比较像素等)。您建议的方法有什么例子吗?我真的什么都不知道。
    • 您可以使用 -f framecrc 或 -f framemd5 而不是 -f image2 来计算图像的哈希值。作为输出文件,给一个文件以将哈希写入该文件,或者 - 将它们写入标准输出。
    【解决方案3】:

    看看PyAV。 (有documentation,但比较稀疏。)

    看起来你可以只打开一个视频,然后遍历帧。

    【讨论】:

    • 我也建议ImageIOMoviePy,它们也可以这样做。
    • 看起来很有趣,一旦我设法安装它,我会尝试。我不断收到构建错误。
    • 在 ms-windows 上构建东西可能既困难又令人沮丧,因为它缺少 UNIX 变体所具有的工具和基础架构。
    猜你喜欢
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多