Использование ffmpeg для вырезания видео

Я использую ffmpeg, чтобы вырезать раздел большого файла следующим образом:

  ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv
 

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

Есть ли способ использовать ffmpeg, чтобы отрезать конец видео без его перекодирования?

245 голосов | спросил Neil 6 Maypm10 2010, 18:12:17

6 ответов


295

Вы можете использовать параметр -ss , чтобы указать временную метку начала и параметр -t , чтобы указать продолжительность кодирования. Временные метки должны быть в формате HH: MM: SS.xxx или в секундах ( s.msec ).

Следующее закроет первые 30 секунд, а затем скопирует все, что составляет 10 секунд после этого:

  ffmpeg -ss 00: 00: 30.0 -i input.wmv -c copy -t 00: 00: 10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv
 

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

Некоторые советы:

  • Для более старых версий ffmpeg, если вы используете -ss после -i , вы получаете более точный поиск за счет более медленного выполнения. См. Также: Поиск с помощью FFmpeg
  • Вы можете использовать -to вместо -t , чтобы указать временную метку, которую вы хотите вырезать. Итак, вместо -i <input> -ss 30 -t 10 , вы также можете сделать -i <input> -ss 30 -to 40 для достижения того же.

  • Если ваш ffmpeg не поддерживает -c , или -to , он, скорее всего, устарел. Скомпилируйте новую версию самостоятельно или загрузить статическую сборку со своей домашней страницы. Это действительно не сложно.

ответил 15 Mayam10 2010, 04:03:41
69

Как отмечали другие люди, добавив -ss раньше (намного быстрее) или после (более точно) значение -i имеет большое значение. Раздел «Быстрый и точный поиск» на странице поиска ffmpeg рассказывает вам, как получить оба, и я использовал его, и это имеет большое значение. В основном вы помещаете -ss до И после -i , просто оставите достаточно времени до того, где вы хотите начать резать, чтобы иметь еще один ключевой фрейм. Пример: Если вы хотите сделать 1-минутный клип, от 9min0sec до 10min 0sec в Video.mp4, вы можете сделать это как быстро, так и быстро, используя:

  ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4
 

Первый -ss ищет быстрый (приблизительно) 8min0sec, а затем второй -ss ищет точно до 9min0sec, а -t 00:01 : 00 вынимает клип 1min0sec.

Также обратите внимание на этот важный момент на этой странице: «Если вы используете -ss с помощью -c: v copy , результирующий поток бит может оказаться прерывистым, а не воспроизводимым , или не синхронизируется с аудиопотоком, поскольку ffmpeg принудительно использует /разделяет на i-кадры. "

Это означает, что вам нужно повторно закодировать видео, даже если вы хотите просто скопировать его или рискнуть его прерывистым и несинхронным. Сначала вы можете попробовать просто -c copy , но если видео отстой, вам нужно будет повторно его сделать.

ответил seriesoftubes 20 Jam1000000amMon, 20 Jan 2014 08:07:24 +040014 2014, 08:07:24
16

Я обнаружил, что -ss в сочетании с -c copy привел к получению второй части в начале.

Чтобы этого избежать, вам нужно удалить -c copy (который, по общему признанию, сделает перекод).

ответил Chris 9 Mayam14 2014, 06:24:58
12

РУЧНОЙ

Откройте файл в медиаплеере, который будет кадр за кадром, и воспроизведите файл AVISynth с такими данными, как:

  DirectShowSource ((«C: \ Downloads \ Video \ Do you want him.flv»), Pixel_Type = "yuy2"). Обрезка (0,0, -0, -0)
Subtitle («C: \ Downloads \ Video \ Do you want him.flv», font = «Arial», size = 24, text_color = $ ff0000, align = 3)
ShowFrameNumber (scroll = true, x = 336, y = 27, font = "Arial", size = 24, text_color = $ ff0000)
ShowTime (x = 398, y = 44, font = "Arial", size = 24, text_color = $ ff0000)
 

Затем вырежьте формат EXACT:

  ffmpeg -i "Путь \ вы хотите him.flv" \
       -ss 00: 00: 05.240 -to 00: 00: 08.360 \
       -vcodec libx264 -acodec libvo_aacenc \
       "Путь \ Вы хотите him1.flv"
 

и

  ffmpeg -i "Путь \ вы хотите him.flv" \
       -ss 00: 00: 10.240 - до 00: 00: 14.360 \
       -vcodec libx264 -acodec libvo_aacenc \
       "Путь \ Вы хотите him2.flv"
 

Теперь создайте файл txt с видеофайлами с содержимым, например:

  file 'C: \ Downloads \ Video \ Вы хотите him1.flv'
файл 'C: \ Downloads \ Video \ Вы хотите him2.flv'
 

Запустить ffmpeg:

  ffmpeg -f concat -i FileList.txt -c copy "Path \ NewName_joined.flv"
 
ответил Budman1 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 04 Sep 2014 09:48:57 +0400 2014, 09:48:57
7

Для меня параметр -t не работает, но -vframes работал. Я предпочитаю использовать #frames , поскольку я бы предпочел разрезать на I-Frames, и я узнал GOP для видео, используя ffprobe .

Командная строка, которая работала для меня:

  ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv
 

Кстати, добавление -ss в начало -i делает большую разницу во времени выполнения.

ответил user225366 19 Mayam13 2013, 07:14:56
1

Как и в случае с user225366, опция -t не работает для коротких видеороликов, но для более длинных видео. Для коротких видео кажется, что -frames: v лучше. Это то, что сработало для меня.

  ffmpeg -ss 4 -i input.mp4 -frames: v 200 -vcodec copy output.mp4
 

-acodec copy необходимо добавить, если видео имеет аудио, как показывают другие ответы.

ответил VectorVortec 8 ThuEurope/Moscow2016-12-08T14:24:57+03:00Europe/Moscow12bEurope/MoscowThu, 08 Dec 2016 14:24:57 +0300 2016, 14:24:57

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132