2010-05-06 14:12:17 +0000 2010-05-06 14:12:17 +0000
357
357

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

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

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

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

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

Ответы (7)

105
105
105
2014-01-20 04:07:24 +0000

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

27
27
27
2014-05-09 02:24:58 +0000

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

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

13
13
13
2014-09-04 05:48:57 +0000

MANUALLY

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

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

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:

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"
8
8
8
2013-05-19 03:14:56 +0000

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

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

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

Кстати, если поставить -ss впереди -i, то это сильно повлияет на время исполнения.

5
5
5
2016-12-08 11:24:57 +0000

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

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

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

0
0
0
2020-02-12 02:20:00 +0000

используйте этот формат:

ffmpeg <start time> <input file> <cut duration> <out file>

, например, вырежьте 60-секундный клип после 1 минуты видео

ffmpeg.exe -ss 00:01:00 -i "in file.mp4" -to 00:01:00 -c copy out.mp4.

0
0
0
2019-09-01 05:29:02 +0000

Я вижу, что не многие упоминают об этом (я не эксперт, так что, возможно, в этом есть подвох), но если в вашем файле есть другие потоки, например, субтитры и другие метаданные, например, главы и т.д., то можно обрезать/обрезать и сохранить все потоки с помощью следующей команды

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

С помощью -map 0 вы берете все потоки в файле, а с помощью -c copy вы копируете их все, как есть.
Использование -to пропуская начало через -ss обрезает входное видео от начала до второй 60.

Скрипка с помощью map полезна также и в том случае, если вы хотите, чтобы в разрезе сохранялись только определенные потоки (может быть, вам не нужны все аудиоисточники в файле, или только некоторые субтитры).

Я использую это, когда мне нужно разделить большие MKV-файлы, которые не могут быть сохранены в FAT32-хранилище.