将视频分解为图像进行处理

Break video into images for processing

我最近找到了 friday,一个用于 haskell 的图像处理库,到目前为止它看起来还不错,但我希望能够加载视频并将它们分解成图像。 haskell有这样的图书馆吗?

我不知道这样的库是否存在,但我怀疑不存在。视频编解码器非常复杂。如果 haskell 的东西存在,它很可能是 ffmpeg 包装器。无论如何,如果您只需要从某些视频中提取帧,我会直接使用 ffmpeg 命令行工具。或者使用系统调用来动态完成。

ffmpeg 命令对于这个任务来说非常简单:

ffmpeg -i "input.mov" -an -f image2 "output_%05d.jpg"

https://en.wikibooks.org/wiki/FFMPEG_An_Intermediate_Guide/image_sequence

请注意,有一些巧妙的 ffmpeg bindings that stream images from a video in the JuicyPixel image types. There is already a ticket 可以让 fridayJuicyPixels 玩得很好 - 如果您真的有兴趣以干净的方式完成这项工作,我强烈建议您制作一个补丁到周五解决这张票。

此外,由于周五的维护者一直忙到 9 月,我很乐意在 my own repository 上将您的一些更改与我的更改合并以供一般使用。

编辑:这很有趣。获取惰性图像列表的一种方法是 unsafeInterleaveIO:

module LazyDemo where

import Vision.Image.JuicyPixels
import Vision.Image (RGBA)
import Codec.FFmpeg
import System.IO.Unsafe

lazyStream :: FilePath -> IO [RGBA]
lazyStream fp = do
    initFFmpeg
    (rd,close) <- imageReader fp
    go rd close
  where
   go rd close = do
       mi <- rd
       case mi of
           Nothing -> close >> return []
           Just i  -> (toFridayRGBA i : ) <$> unsafeInterleaveIO (go rd close)