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 文件。
我有一堆 .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 文件。