R,编辑电影文件或avi文件?

R, edit movie files or avi files?

我有一堆 .avi 文件要加载到 R 中,将每一帧分解为单独的图像,排列图像,然后另存为单独的图像。尽管真诚地努力尝试找到一个包来加载 .avi 文件,但我找不到任何东西。

1) 是否可以在 r 中加载和使用 avi 文件?

2) 这是怎么做到的?

3) 有专门的库吗?

我看过几个使用 linux 的例子,比如这个 post,但我希望有一个 R 解决方案。

Converting AVI Frames to JPGs on Linux

我想通了。如评论部分所述,ffmpeg是R中各种包调用的包,用于将视频加载到R环境中。 Imager 包有一个名为 "load.video.internal" 的函数,它运行良好并使用 ffmpeg。我不得不从 github 下载软件包,因为这个功能在我使用 "install.packages" 安装的版本中不可用。我结束了 copy/pasting 源包中的函数并注释掉了对 "has.ffmpeg" 函数的引用,因为它一直挂在这一步。使用粘贴,我能够指示文件路径并成功加载 avi 文件。

修改后的load.video.internal函数:

load.video.internal <- function(fname,maxSize=1,skip.to=0,frames=NULL,fps=NULL,extra.args="",verbose=FALSE)
{
  # if (!has.ffmpeg()) stop("Can't find ffmpeg. Please install.")
  dd <- paste0(tempdir(),"/vid")
  if (!is.null(frames)) extra.args <- sprintf("%s -vframes %i ",extra.args,frames)
  if (!is.null(fps)) extra.args <- sprintf("%s -vf fps=%.4d ",extra.args,fps)

  arg <- sprintf("-i %s %s -ss %s ",fname,extra.args,as.character(skip.to)) %>% paste0(dd,"/image-%d.bmp")
  tryCatch({
    dir.create(dd)
    system2("ffmpeg",arg,stdout=verbose,stderr=verbose)
    fls <- dir(dd,full.names=TRUE)
    if (length(fls)==0) stop("No output was generated")
    ordr <- stringr::str_extract(fls,"(\d)+\.bmp") %>% stringr::str_split(stringr::fixed(".")) %>% purrr::map_int(~ as.integer(.[[1]])) %>% order
    fls <- fls[ordr]
    #Check total size
    imsz <- load.image(fls[[1]]) %>% dim %>% prod
    tsz <- ((imsz*8)*length(fls))/(1024^3)
    if (tsz > maxSize)
    {
      msg <- sprintf("Video exceeds maximum allowed size in memory (%.2d Gb out of %.2d Gb)",tsz,maxSize)
      unlink(dd,recursive=TRUE)
      stop(msg)
    }
    else
    {
      out <- map_il(fls,load.image) %>% imappend("z")
      out

    } },
    finally=unlink(dd,recursive=TRUE))

}

使用示例:

vid_in <- load.video.internal(paste("/home/phil/Documents/avi_files/Untitled.avi"))

更新的简化版本:

magick 包将使用 image_read 函数读取 avi 文件。