Top.Mail.Ru
Ответы

Ffmpeg, удалить часть видео

Трям. Плиз, знающие, помогите.
Необходимо из середины видео вырезать кусок и удалить его. Это можно сделать одной командой, или резать кусками и склеивать? Если да, помогите составить команду. Перекодировать или еще что-то делать не надо

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок

пролистал по быстрому, вроде ничего, посмотрите - "FFmpeg. Трюки и хитрости": https://habr.com/ru/post/536170/

ещё форум: http://forum.ru-board.com/topic.cgi?forum=5&topic=45173

Аватар пользователя
Высший разум

Одной командой ffmpeg - никак. "Ответчик" не удалил а сохранил середину файла.

1. Создаём временные сегменты для сохранения "начала" (до 11-й минуты) и "окончания" (с 11-й минуты 10-й секунды):

ffmpeg -t 00:11:00 -i input.mp4 -map 0 -c copy segment1.mp4
ffmpeg -ss 00:11:10 -i input.mp4 -map 0 -c copy segment2.mp4

2. Создаём список из файлов для "склейки" input.txt следующего содержания (можно обойтись без него - используя регулярные выражения на следующем шаге):

file 'segment1.mp4'
file 'segment2.mp4'

3. объединяем их с помощью демуксера concat:

ffmpeg -f concat -i input.txt -map 0 -c copy output.mp4

Учтите, "распиловка" может быть не точной, так как без перекодирования файлы "режутся" только по ключевым кадрам.

Если это не однократная потребность, то лучше на основе вышеуказанного составить скрипт с "подчисткой" и входными параметрами. Однако его содержание, как и регулярные выражения будут зависеть от используемой ОС.

Аватар пользователя
Знаток
2мес

Ответил, но дополню.

Одной командой сложно это сделать, долго надо будет правильно создавать и отлаживать параметры этой команды. То есть можно, но проще и быстрее делать несколькими запусками ffmpeg.

Командная строка вырастет при выполнении данной задачи, а в OS Windows есть ограничение на длину этой строки, кажется 255 символов. Для обхода этого ограничения есть возможность у ffmpeg запускать скрипт из файла. То есть ограничение можно обойти будет.

Пример готовый "нагуглил" [ https://www.mux.com/articles/clip-sections-of-a-video-with-ffmpeg ] довольно быстро, вот как из видео вырезать два кусочка и объединить в клип в один запуск ffmpeg. Это надо поместить например в файл concat.cmd :
ffmpeg -i input_file.mp4 ^
-filter_complex ^
"[0:v][0:a]trim=start=00:01:30:end=00:02:00,setpts=PTS-STARTPTS[v1][a1]; ^
[0:v][0:a]trim=start=00:03:00:end=00:03:30,setpts=PTS-STARTPTS[v2][a2]; ^
[v1][a1][v2][a2]concat=n=2:v=1:a=1[outv][outa]" ^
-map "[outv]" -map "[outa]" output.mp4


Спасибо, удачи!

P.S. Сложности могут возникнуть, поэтому это не сработает если...
Например в исходном видео есть другие потоки, которые Вы бы хотели сохранить, например картинка, ну или субтитры.
В примере кажется работа только с одним потоком видео и одним потоком аудио, что потребует подумать как модифицировать выполняемую командную строку, если например нужна другая дорожка звука.