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


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

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

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

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


247
2018-05-06 14:12


Источник


этот синтаксис верен. - jiggunjer
stackoverflow.com/questions/18444194/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


Ответы:


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


297
2018-05-15 00:03



@Mondain На самом деле, вы получаете больше точности, чтобы положить -ss после. И slhck упоминает это здесь blog.superuser.com/2012/02/24/...  также в документации ffmpeg для -ss он упоминает разницу между помещением до или после. - barlop
+1 Я пришел сюда, чтобы понять, как игнорировать все после первых 35 секунд, спасибо: ffmpeg -i input.wmv -c copy -t 35 output.wmv - karlphillip
Это не работает для меня (mp4). Он просто создает 5-секундный черный экран: frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s - clocksmith
Это создало 3-4-х черный экран в начале моего видеоклипа. Модификация Криса с пропуском -c copy удалили начальный черный экран, см. его ответ для деталей. - Joel Ostblom
Вы пишете «Следующие будут скопировать первые 30 секунд, а затем закрепить все, что составляет 10 секунд после этого:« <- Что это значит? Под клипом вы подразумеваете include? 'cos clip может означать клип. Предположим, вы имеете в виду включить. Вы имеете в виду «Пуск» с 30 секунд и включаете только 10 секунд? Если это так, я предлагаю вам написать, что это будет намного яснее. - barlop


Как говорили другие люди, -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 быстро ищет (приблизительно) 8мин0сек, а затем второй -ss точно соответствует 9мин0сек, а -t 00:01:00 вынимает клип 1мин0сек.

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

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


69
2018-01-20 04:07



то же предупреждение применяется к -c:a copy для этого способа поиска. - jiggunjer
Лучший ответ, таким образом, работал лучше для меня. - Ondra Žižka


я нашел это -ss в сочетании с -c copy привело к полуторасекундной отбивной в начале.

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


16
2018-05-09 02:24



Существует еще один ответ, который касается точности. Повторное кодирование с параметром по умолчанию часто НЕ является тем, что вы хотите сделать! - Tomasz Gandor
Хорошая точка @ ТомазГандор - 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)

Затем разрезаем формат EXACT:

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"

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

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"

12
2017-09-04 05:48





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

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

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

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


7
2018-05-19 03:14



На самом деле -vframes (или -frames:v) должны появиться после -i потому что это опция вывода. - slhck


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

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

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


1
2017-12-08 11:24