Я понял это. Как указано в разделе комментариев, 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 будет читать файлы avi с помощью функции image_read.