it-swarm-ru.tech

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

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

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

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

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

301
Neil

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

360
user37242

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

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

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

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

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

86
seriesoftubes

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

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

22
Chris

ВРУЧНУЮ

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

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(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)

Затем вырезать с точным форматом времени:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

а также

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

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

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Запустите ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"
14
Budman1

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

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

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

Между прочим, размещение -ss перед -i имеет большое значение во времени выполнения.

9
Ben

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

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

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

4
VectorVortec