Могу ли я использовать R для обрезки видео, как я делаю с ffmpeg? - PullRequest
0 голосов
/ 09 июля 2020

У меня есть несколько видеофайлов, которые мне нужно обрезать / вырезать (например, вырезать 00:05:00 - 00:10:00 из 2-часового видео). Я могу обрезать / вырезать каждое видео с помощью ffmpeg. Однако, поскольку у меня есть +100 видеофайлов, которые необходимо обрезать, я хотел бы использовать для этого функцию R l oop.

Я обнаружил, что есть несколько пакетов R, которые люди используют для обработка видео, такая как imager или magick, но я не могу найти способ обрезать видео с помощью R.

Вы можете мне помочь? Спасибо!

1 Ответ

0 голосов
/ 09 июля 2020

Основной c подход к обрезке видео с помощью ffmpeg будет примерно таким:

ffmpeg -i input.mp4 -ss 00:05:00 -to 00:10:00 -c copy output.mp4

Чтобы создать пакетный файл, вы можете поместить следующее в текстовый файл и сохранить его как что-то вроде "trimvideo.bat" и запустите его в соответствующей папке.

@echo off
:: loops across all the mp4s in the folder
for %%A in (*.mp4) do ffmpeg -i "%%A"^
  :: the commands you would use for processing one file
  -ss 00:05:00 -to 00:10:00 -c copy ^
  :: the new file (original_trimmed.mp4)
  "%%~nA_trimmed.mp4"
pause

Если вы хотите сделать это через R, вы можете сделать что-то вроде:

# get a list of the files you're working with
x <- list.files(pattern = "*.mp4")

for (i in seq_along(x)) {
  cmd <- sprintf("ffmpeg -i %s -ss 00:05:00 -to 00:10:00 -c copy %_trimmed.mp4",
                 x[i], sub(".mp4$", "", x[i]))
  system(cmd)
}

I Я использовал подобный подход в прошлом, когда хотел вырезать определенные c частей из файла или нескольких файлов. В этих случаях я начинаю с data.frame, аналогичного следующему:

df <- data.frame(file = c("file_A.mp4", "file_B.mp4", "file_A.mp4"),
                 start = c("00:01:00", "00:05:00", "00:02:30"),
                 end = c("00:02:20", "00:07:00", "00:04:00"),
                 output = c("segment_1.mp4", "segment_2.mp4", "segment_3.mp4"))
df
#         file    start      end        output
# 1 file_A.mp4 00:01:00 00:02:20 segment_1.mp4
# 2 file_B.mp4 00:05:00 00:07:00 segment_2.mp4
# 3 file_A.mp4 00:02:30 00:04:00 segment_3.mp4

Я использую sprintf для создания ffmpeg команд, которые я хочу запустить:

cmds <- with(df, sprintf("ffmpeg -i %s -ss %s -to %s -c copy %s", 
                         file, start, end, output)) 
cmds
# [1] "ffmpeg -i file_A.mp4 -ss 00:01:00 -to 00:02:20 -c copy segment_1.mp4"
# [2] "ffmpeg -i file_B.mp4 -ss 00:05:00 -to 00:07:00 -c copy segment_2.mp4"
# [3] "ffmpeg -i file_A.mp4 -ss 00:02:30 -to 00:04:00 -c copy segment_3.mp4"

И я запускаю его, используя lapply(..., system):

lapply(cmds, system)

Вы также можете посмотреть пакет av, но я всегда просто предпочитал использовать al oop в терминале или создавать команды для запускаться с использованием sprintf и system().

...