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

Вход и выход с использованием той же частоты кадров

Используйте опцию входа -framerate:

ffmpeg -framerate 24 -i input_%03d.png output.foo
По умолчанию -framerate 25. Выход будет использовать ту же частоту кадров, что и вход. В этом примере предполагается, что каждый вход последовательно называется input_001.png, input_002.png и т. Д. Более подробную информацию см. В документации по демультиплееру файлов изображений FFmpeg.

Вход и выход с использованием другой частоты кадров

Если вы хотите показывать каждое изображение на определенное время, но имеете стандартную частоту кадров вывода для совместимости, вы можете добавить и кадры будут отброшены или дублированы для компенсации. В следующем примере каждое изображение будет отображаться в течение 1 секунды, но выход будет иметь частоту кадров 24. Без -r многие игроки не смогут воспроизводить видео с частотой кадров 1.

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

3 ответа

Задача, столь сложная, как это (насколько мне известно), не может быть выполнена с помощью ffmpeg в одиночку и в одном вызове, но я добавлю версию oneline ниже. Вот версия скрипта:

#!/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, чтобы получить общую продолжительность видео в секундах, это значение используется для создания петли while для частей. Внутри цикла ffmpeg вызывается для создания частей, как .mp4, так и .srt в одном вызове.

Пример run

$ 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

Версия Oneline [!d3 ]

Первые две переменные хранят имя файла и продолжительность в секундах, приспосабливают эти два к вашим потребностям.

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

Ссылки

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

FFmpeg: Как эффективно разделить видео? Использование ffmpeg для добавления текстовых субтитров Как отключить декодирование субтитров в ffmpeg Как извлечь субтитры из видео с помощью ffmpeg?
3
ответ дан 22 May 2018 в 11:45

Задача, столь сложная, как это (насколько мне известно), не может быть выполнена с помощью ffmpeg в одиночку и в одном вызове, но я добавлю версию oneline ниже. Вот версия скрипта:

#!/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, чтобы получить общую продолжительность видео в секундах, это значение используется для создания петли while для частей. Внутри цикла ffmpeg вызывается для создания частей, как .mp4, так и .srt в одном вызове.

Пример run

$ 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

Версия Oneline

Первые две переменные хранят имя файла и продолжительность в секундах, приспосабливают эти два к вашим потребностям.

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

Ссылки

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

FFmpeg: Как эффективно разделить видео? Использование ffmpeg для добавления текстовых субтитров Как отключить декодирование субтитров в ffmpeg Как извлечь субтитры из видео с помощью ffmpeg?
3
ответ дан 17 July 2018 в 17:59

Задача, столь сложная, как это (насколько мне известно), не может быть выполнена с помощью ffmpeg в одиночку и в одном вызове, но я добавлю версию oneline ниже. Вот версия скрипта:

#!/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, чтобы получить общую продолжительность видео в секундах, это значение используется для создания петли while для частей. Внутри цикла ffmpeg вызывается для создания частей, как .mp4, так и .srt в одном вызове.

Пример run

$ 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

Версия Oneline

Первые две переменные хранят имя файла и продолжительность в секундах, приспосабливают эти два к вашим потребностям.

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

Ссылки

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

FFmpeg: Как эффективно разделить видео? Использование ffmpeg для добавления текстовых субтитров Как отключить декодирование субтитров в ffmpeg Как извлечь субтитры из видео с помощью ffmpeg?
3
ответ дан 23 July 2018 в 18:50

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

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