【问题标题】:R, edit movie files or avi files?R,编辑电影文件或 avi 文件?
【发布时间】:2018-09-03 19:10:01
【问题描述】:

我有一堆 .avi 文件想加载到 R 中,将每一帧分解为单独的图像,排列图像,然后保存为单独的图像。尽管我非常努力地试图找到一个加载 .avi 文件的包,但我什么也找不到。

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

2) 这是怎么做到的?

3) 有专门的库吗?

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

Converting AVI Frames to JPGs on Linux

【问题讨论】:

  • 也许是 CRAN 包 Rbgs。见函数readvideo {Rbgs}
  • 你试过imager package吗?
  • 是的,试过成像仪。但它并不特定于 avi 甲酸盐。我还没有尝试过 Rbgs。我注意到很多人都有使用 Magick 包的 bash 解决方案。这现在可以在 R 中使用,所以我打算接下来尝试一下。
  • 再想一想,成像仪应该可以工作。等我弄明白了,我会尽快发布解决方案。
  • FFmpeg 是 R 中大多数程序用来将视频文件加载到 r 环境中的包。

标签: r image video avi


【解决方案1】:

我想通了。如 cmets 部分所述,ffmpeg 是 R 中各种包调用的包,用于将视频加载到 R 环境中。 Imager 包有一个名为“load.video.internal”的函数,该函数运行良好并使用 ffmpeg。我不得不从 github 下载包,因为这个功能在我使用“install.packages”安装的版本中不可用。我最终从源包中复制/粘贴函数并注释掉对“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 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2010-09-27
    • 2015-07-21
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多