我有一堆.avi文件,我想加载到R中,将每个帧分解为单个图像,排列图像,然后另存为单独的图像。尽管竭尽全力试图找到一个加载.avi文件的程序包,但我什么都找不到。
1)是否可以在r中加载和使用avi文件?
2)如何完成?
3)是否有为此专用的库?
我已经看到了一些使用linux的示例,例如本文,但是我希望有一个R解决方案。
答案 0 :(得分:0)
我知道了。如评论部分所示,ffmpeg是R中各种程序包调用的程序包,用于将视频加载到R环境中。 Imager软件包具有一个名为“ load.video.internal”的功能,该功能可以很好地使用ffmpeg。我不得不从github下载该软件包,因为在使用“ install.packages”安装的版本中该功能不可用。我最终从源包中复制/粘贴了该函数,并注释掉了对“ has.ffmpeg”函数的引用,因为该函数在此步骤中一直处于挂起状态。使用粘贴,我能够指出文件路径并成功加载avi文件。
修改后的load.video。内部函数:
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"))
更新的SIMPLER版本:
magick软件包将使用image_read函数读取avi文件。