131

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

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

6 ответов6

227

Установите 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" 
22

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

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

Посмотрите также ffmpeg Doc или эту вики-страницу.

8

Странно, что никто не предлагал 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
3

Вы можете использовать эти два метода, которые работают для 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> - начало фрагмента видео, которое нужно вырезать. Формат: 00:00:00.0000 , что означает часы: минуты: секунды: миллисекунды.

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

Примеры:

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 секунд.

-1

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

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

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

-2

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

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

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

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