R, редактировать файлы фильмов или AVI файлы? - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть куча файлов .avi, которые я хотел бы загрузить в R, разбить каждый кадр как отдельное изображение, упорядочить изображения и сохранить как отдельное изображение. Несмотря на искренние попытки найти пакет для загрузки файлов .avi, я ничего не могу найти.

1) можно ли загружать и работать с файлами avi в r?

2) как это сделать?

3) для этого есть специальная библиотека?

Я видел несколько примеров использования linux, таких как этот пост, но я надеюсь на решение R.

Преобразование кадров AVI в JPG в Linux

1 Ответ

0 голосов
/ 03 сентября 2018

Я понял это. Как указано в разделе комментариев, 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.

...