284

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

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

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

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

6 ответов6

339

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

83

Как упоминали другие люди, установка -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 00:01:00 снимает клип длительностью 1 минута.

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

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

20

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

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

14

ВРУЧНУЮ

Откройте файл в медиаплеере, который будет перемещаться по кадрам, и воспроизведите файл 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"
9

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

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

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

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

4

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

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

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

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