У меня есть большой видеофайл (large.mp4
) и соответствующий файл подзаголовка (large.srt
).
Что лучший способ состоит в том, чтобы разделить обоих файлы на n равные части?
Это произведет large-1.mp4
, ... , large-n.mp4
и large-1.srt
, ..., large-n.srt
. И все эти файлы будут иметь равный размер (кроме последних).
Что лучший способ состоит в том, чтобы разделить обоих файлы на части определенной продолжительности, скажем, 15 минут?
Вывод будет подобен тому, обозначенному выше.
Я хотел бы использовать инструмент командной строки, предпочтительно ffmpeg
и предпочтительно прямая команда, без сценария.
Задача как комплекс как это (к моему знанию) не может быть, покончили ffmpeg
один и в одном единственном вызове, но я добавлю короткую версию ниже. Вот версия сценария:
#!/bin/bash
in=$1
dur=$2
totaldur=$(ffprobe -v -8 -show_entries format=duration -of flat large.mp4 | sed -r 's/.*"([0-9]+).*/\1/')
i=0
while (( i * dur < totaldur) )
do
ffmpeg -i $in -i ${in%%.*}.srt \
-ss $((i*dur)) -t $dur -c copy -sn ${in%%.*}-$((i+1)).${in#*.} \
-ss $((i*dur)) -t $dur -an -vn ${in%%.*}-$((i+1)).srt
((i++))
done
Этот сценарий берет два аргумента, при этом первый является именем файла видео, и второе, являющееся продолжительностью в секундах, посмотрите пример, выполненный ниже. Это сначала передает вывод по каналу ffprobe
кому: sed
для получения общей продолжительности видео в секундах это значение используется для создания a while
цикл для частей. В цикле ffmpeg
назван для создания частей, оба .mp4
и .srt
в одном вызове.
$ tree # the directory contains large.mp4 and large.srt
.
├── large.mp4
└── large.srt
$ ffmpeg -i large.mp4 |& awk '/Duration/' # large.mp4 has a duration of 00:02:30.07
Duration: 00:02:30.07, start: 0.000000, bitrate: 1283 kb/s
$ /path/to/above/script large.mp4 60 # let's split it after every 60 seconds
$ tree
.
├── large-1.mp4
├── large-1.srt
├── large-2.mp4
├── large-2.srt
├── large-3.mp4
├── large-3.srt
├── large.mp4
└── large.srt
Первые две переменные содержат имя файла и продолжительность в секундах, корректируют те два к Вашим потребностям.
in=large.mp4;dur=60;i=0;while ((i*dur<$(ffprobe -v -8 -show_entries format=duration -of flat large.mp4|sed -r 's/.*"([0-9]+).*/\1/')));do ffmpeg -y -i $in -i ${in%%.*}.srt -ss $((i*dur)) -t $dur -c copy -sn ${in%%.*}-$((i+1)).${in#*.} -ss $((i*dur)) -t $dur -an -vn ${in%%.*}-$((i+1)).srt;((i++));done
Вот некоторые ссылки, которые я нашел на пути: