С помощью ffmpeg я могу указать время начала и продолжительность каждого сегмента. Например я написал

ffmpeg -i "originalvideo.mp4" -ss 00:00 -t 2:34 -vcodec copy -acodec copy "smallervideo1.mp4"

У меня есть таблица, где у меня есть 3 столбца; название меньшего видео, время начала и время окончания. Я мог бы создать каждую команду отдельно для каждого видео, но это заняло бы некоторое время, если бы я разбивал исходные файлы на почти 100 небольших видео.

Есть ли способ, где я могу передать значения из электронной таблицы в ffmpeg и автоматически выводить каждое видео с соответствующим именем?

1 ответ1

1

Это можно сделать с помощью простого сценария оболочки, в данном случае сценария Bash. Если в качестве входных данных используется файл с пробелами, разделенный пробелами, который содержит имя выходного файла, начальную временную метку и конечную временную метку, например:

$ cat cuts.txt
foo.mp4 00:00:00 00:00:01
bar.mp4 00:01:20 00:02:00

Затем прочитайте это с помощью простого цикла и создайте команду ffmpeg:

while read -r filename start end; do
  ffmpeg -i "input.mp4" -ss "$start" -to "$end" -c copy "$filename"
done < cuts.txt

Это просто обрезает поток битов без кодирования - -c copy является сокращением для -vcodec copy -acodec copy (и также копирует субтитры). Вы можете указать видеокодер (например, -c:v libx264) и аудиокодер (например, -c:a aac -b:a 192k) для перекодирования видео.

Более переносимая, но базовая версия с Python 3:

#!/usr/bin/env python3
import subprocess
with open("cuts.txt") as f:
  for line in f.readlines():
    filename, start, end = line.strip().split(' ')
    cmd = ["ffmpeg", "-i", "input.mp4", "-ss", start, "-to", end, "-c", "copy", filename]
    subprocess.run(cmd, stderr=subprocess.STDOUT)

Примечание: если вы запускаете это в Windows, вы должны добавить ffmpeg в вашу PATH или указать полный путь, например C:/Program Files/ffmpeg/bin/ffmpeg.exe .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .