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

144

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

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

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

x74x61
источник

Ответы:

244

Установите 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копирует первый битовый поток видео, аудио и субтитров из входного в выходной файл без их перекодирования. Это не повредит качеству и заставит команду работать в течение нескольких секунд.

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

Если вы не включите эту -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
slhck
источник
1
В Ubuntu 12:10 -c: v и -c: a не работали. Вместо этого мне пришлось использовать «-acodec copy и -vcodec copy».
Самуэль Лампа
1
@Samuel Тогда вы используете устаревшую версию, которая даже не настоящая FFmpeg, а вилка Libav. См .: stackoverflow.com/a/9477756/1109017
slhck
Спасибо за это! если вы не укажете продолжительность, будет ли она идти до конца?
Джефф
@ Джефф Да! (минимум символов)
slhck
3
@Prateek При копировании потока битов видео (вместо перекодирования) вы можете вырезать только ключевые кадры . Если в секундах 1, 2 и 3 имеются ключевые кадры, но вы хотите выполнить обрезку на секунде 1,5, то ffmpeg будет ждать до секунды 2, прежде чем он сможет начать обрезку. Это делает это неточным.
Slhck
26

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

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

Взгляните также на документ ffmpeg или на эту вики-страницу .

sflee
источник
6
ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFileболее простая версия
nwgat
3
Мне пришлось использовать ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4версию (с -copyts), в противном случае она была обрезана неправильно (с черным экраном в начале). Спасибо за вторую ссылку, хотя.
Некрономикон
Это здорово, последнее, что я хотел, это рассчитать продолжительность от конечных точек.
Томаш Гандор
Опция -to отвечает на фактически заданный вопрос. Остальные ответы либо неуместны, либо устарели.
Джеймс Бауэри
12

Странно, что никто не предложил 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
Да, приятно упомянуть trimи atrim. Я обычно использую их при фильтрации, но пользователи должны заметить, что фильтрация требует перекодирования .
Llogan
Ты мой герой. Мне очень нужен фильтр, который сделал это.
Фахадаш
5

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

Кристиан Вёрц
источник
Хорошо, спасибо. Посмотрю документы и попробую завтра.
juGGaKNot
3
-sameqне означает "то же качество" и был удален из ffmpeg. Используйте -codec copyвместо этого. Также не забывайте об этом -toварианте.
Llogan
Я исправил команды в вашей цитате, так как они были довольно устаревшими. Пожалуйста, не копируйте и не вставляйте информацию без правильного цитирования.
Slhck
-1

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

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

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

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

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

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

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

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