Как разделить видеофайл наряду с соответствующим файлом подзаголовка?

У меня есть большой видеофайл (large.mp4) и соответствующий файл подзаголовка (large.srt).

Что лучший способ состоит в том, чтобы разделить обоих файлы на n равные части?

Это произведет large-1.mp4, ... , large-n.mp4 и large-1.srt, ..., large-n.srt. И все эти файлы будут иметь равный размер (кроме последних).

Что лучший способ состоит в том, чтобы разделить обоих файлы на части определенной продолжительности, скажем, 15 минут?

Вывод будет подобен тому, обозначенному выше.

Я хотел бы использовать инструмент командной строки, предпочтительно ffmpeg и предпочтительно прямая команда, без сценария.

4
задан 13 April 2018 в 23:03

1 ответ

Задача как комплекс как это (к моему знанию) не может быть, покончили 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

Ссылки

Вот некоторые ссылки, которые я нашел на пути:

3
ответ дан 1 December 2019 в 10:00

Другие вопросы по тегам:

Похожие вопросы: