Вопрос: Отрезать часть из видеофайла с начальной позиции до конечной позиции с помощью FFmpeg [duplicate]


На этот вопрос уже есть ответ:

У меня есть видеофайл продолжительностью 30 минут, но я хочу извлечь видео с 00:09:23 до 00:25:33.

Я могу определить начало с помощью -ss, но я не смог найти его для конечной позиции. Любая помощь, пожалуйста?


116
2018-01-11 17:59


Источник




Ответы:


Установить ffmpeg

Убедись, что ты загрузить последнюю версию ffmpeg, и не используйте тот, который поставляется с вашим дистрибутивом (например, Ubuntu). Упакованные версии из разных дистрибутивов часто устаревают и не ведут себя так, как ожидалось.

Или скомпилируйте его самостоятельно,

Как вырезать видео без перекодирования

Используйте это, чтобы вырезать видео из [start] для [duration]:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

Здесь варианты означают следующее:

  • -ss указывает время начала, например. 00:01:23.000 или 83 (в секундах)
  • -t определяет продолжительность клипа (тот же формат).
  • последний ffmpeg также имеет флаг для подачи времени окончания -to,
  • -c copy копирует первый поток видео, аудио и субтитров из входа в выходной файл без повторной кодировки. Это не повредит качеству и запустит команду в течение нескольких секунд.

Обратите внимание, что с более старыми версиями ffmpeg эта команда может не соответствовать кадру при копировании потоков битов.

Как вырезать видео без перекодирования - точный метод

Если у вас есть старая версия ffmpeg и вам нужна точность кадра, используйте вместо этого:

ffmpeg -i in.mp4 -ss [start] -t [duration] -c copy out.mp4

Однако есть один недостаток. Видео необходимо будет декодировать до тех пор, пока оно не достигнет позиции, подразумеваемой -ss, и только тогда он начинает копировать бит-поток. Это может занять много времени, особенно для действительно длинных видеороликов.

Как вырезать видео с повторным кодированием

Если вы не учитываете -c copy вариант, ffmpeg автоматически перекодирует выходные видео и аудио в соответствии с выбранным вами форматом. Для высококачественного видео и аудио, прочитайте Руководство по кодированию x264 и Руководство по кодированию AAC, соответственно.

Например:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4

Как объясняется Ищу с FFmpeg): Когда используешь -ss до -i на FFmpeg 2.1 и новее поиск выполняется с точностью до кадра при повторном кодировании видео (т. е. не используется -c copy). Поэтому вам не нужно беспокоиться о том, чтобы -ss после -i для скорости.


Преобразование конечных точек в продолжительность

Если вам нужно использовать старую версию ffmpeg и не может использовать -to , вы можете создать список редактирования точек ввода и вывода и преобразовать их в точки с длительностью. Для этого вы можете использовать этот скрипт Ruby Я написал, который вычисляет разницу:

require "Time"
def time_diff(time1_str, time2_str)
  t = Time.at( Time.parse(time2_str) - Time.parse(time1_str) )
  (t - t.gmt_offset).strftime("%H:%M:%S.%L")
end

Например:

time_diff("00:09:23.000", "00:25:33.000")
=> "00:16:10.000" 

206
2018-01-11 21:02



На ubuntu 12:10, -c: v и -c: a не работает. Вместо этого мне пришлось использовать «-какодную копию и -vcodec copy». - Samuel Lampa
@Samuel Затем вы используете устаревшую версию, которая даже не настоящая FFmpeg, а вилка Libav. Видеть: stackoverflow.com/a/9477756/1109017 - slhck
Спасибо за это! если вы не укажете продолжительность, она будет идти до конца? - Jeff
@Jeff Да! (минимальный символ) - slhck
@Prateek При копировании битового потока видео (вместо повторного кодирования) вы можете разрезать только ключевые кадры, Если в секундах 1, 2 и 3 есть ключевые кадры, но вы хотите вырезать второй 1,5, то ffmpeg будет ждать второй секунды, прежде чем начнется резка. Это делает его неточным. - slhck


Думаю, теперь вы можете использовать следующую команду.

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

Посмотрите также ffmpeg Doc, или Эта страница вики,


17
2018-05-07 02:30



ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFile более простая версия - nwgat
Мне пришлось использовать ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4 версии (с -copyts), в противном случае оно вырезается неправильно (с черным экраном в начале). Спасибо за вторую ссылку. - Necronomicron
Это здорово, последнее, что я хотел, - это рассчитать продолжительность от конечных точек. - Tomasz Gandor
Опция -to отвечает на вопрос, который был действительно задан. Остальные ответы либо дерзкие, либо устаревшие. - James Bowery


Странно, что никто не предлагал trim  фильтр,

Бросьте все, кроме второй минуты ввода:

ffmpeg -i INPUT -vf trim=60:120

Сохраняйте только первую секунду:

ffmpeg -i INPUT -vf trim=duration=1

Бросьте все, кроме второго 13 на второе 58:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT

8
2018-04-07 15:10



Да, хорошо упомянуть trim а также atrim, Обычно я использую их при фильтрации, но пользователи должны учитывать, что для фильтрации требуется повторное кодирование, - LordNeckbeard
Ты мой герой. Мне очень нужен фильтр, который сделал это. - fahadash


Вы можете использовать эти два метода, которые работают для Windows и Linux.

Существует два способа разделения видеофайлов на ffmpeg. Первый из них хорош сам по себе, более того - он быстрее, но иногда создает выходные файлы с определенными недостатками. Таким образом, для этих случаев существует второй способ разделения видеофайлов: он значительно медленнее, выходные файлы больше, но, похоже, они всегда имеют тот же уровень качества, что и используемые входные файлы.

Способ 1:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi

Способ 2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start> - начало части видео ffmpeg вырезать. Формат: 00:00:00.0000, что означает часы: минуты: секунды: миллисекунды.

  • <duration> - длительность части видео ffmpeg должна быть вырезана. Тот же формат, что и выше.

Примеры:

ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi

ffmpeg вырезает часть видеофайла, начиная с 1 часа 19 минут 0 секунд. Длительность вырезания видеопоследовательности составляет 5 минут 0 секунд.


3
2017-10-03 19:08



Хорошо, thnx. Будет проверять документы и дать им попробовать завтра. - juGGaKNot
-sameq не означает «то же качество», и был удален из ffmpeg. использование -codec copy вместо. Кроме того, не забывайте о -to вариант. - LordNeckbeard
Я исправил команды в вашей цитате, поскольку они были довольно устаревшими. Пожалуйста, не копируйте информацию вставки без правильного цитирования. - slhck


Вы можете использовать это

ffmpeg -sameq -ss clip_start -t duration  -i  original.ogg  clip.ogg

Здесь вы должны предоставить продолжительность видео. то есть. 00: 25: 33-00: 09: 23


-1
2018-01-11 18:29



Как я уже упомянул в другом ответе: с вашей командой вы перекодируете файл, что абсолютно не обязательно, и приводит к снижению качества и увеличению времени обработки. - slhck


Я использую следующий синтаксис для вырезания видео с помощью ffmpef:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t используется для установки продолжительности в секундах - вы не можете указать время окончания, но это должно сработать для вас.


-2
2018-01-11 18:27



Почему вы устанавливаете FFmpeg для повторного кодирования файла? Обратите внимание, что -sameq не означает «того же качества» вообще. - slhck