Я пытаюсь удалить сегмент (00:26:00 - 00:32:30) из видеофайла input.mp4 .
Поскольку нет способа сделать это напрямую с помощью ffmpeg (насколько я знаю), я вместо этого обрезаю сегменты, которые мне нужны, в выводе, а затем объединяю их.

После небольшого поиска я обнаружил, что есть 2 способа сделать это:

К сожалению, оба эти метода не работают для меня.

Я собираюсь объяснить шаги, которые я выполнил в обоих методах:

1. Используя trim:

РЕДАКТИРОВАТЬ: этот метод работает сейчас; вместо этого перейдите ко второму способу.

Используемая команда:

ffmpeg -i input.mp4 -filter_complex \
"[0:v]trim=duration=00:26:00[a]; \
[0:v]trim=start=00:32:30,setpts=PTS-STARTPTS[b]; \
[a][b]concat[c]" -map [c] out.mp4

Вывод команды: ссылка

Длина выходного файла составляет менее 1 минуты и составляет всего 6,8 МБ, тогда как размер входного файла составлял 900 МБ.

2. Используя seek

Используемая команда:

# Cut first wanted segment
ffmpeg -ss 00:00:00 -i input.mp4 -t 00:26:00 -c copy -avoid_negative_ts 1 first.mp4

# Cut second wanted segment
ffmpeg -ss 00:32:30 -i input.mp4 -c copy -avoid_negative_ts 1 second.mp4

# Combine all the wanted segments
ffmpeg -f concat -i input.txt -c copy output.mp4

где input.txt содержит:

file first.mp4
file second.mp4

Вывод команды: ссылка (ошибка указана в строке 90: input.txt: Invalid argument)

Выходной файл, который я получаю в этом случае, составляет всего около 500 МБ (входной файл 900 МБ) и содержит первое видео + первые несколько минут второго видео.

Детали моей системы:

РЕДАКТИРОВАТЬ:

Метод 1, использующий trim , теперь работает, благодаря комментарию @ Mulvya относительно записи секунд в качестве единицы времени вместо нотации HH:MM:SS, поскольку она нарушена.

Новая команда:

ffmpeg -i input.mp4 -filter_complex \
"[0:v]trim=duration=1500[av]; \
 [0:a]atrim=duration=1500[aa];\
 [0:v]trim=start=1980,setpts=PTS-STARTPTS[bv]; \
 [0:a]atrim=start=1980,asetpts=PTS-STARTPTS[ba];\
 [av][bv]concat[outv]; [aa][ba]concat=v=0:a=1[outa]" \
 -map [outv] -map [outa] out.mp4

Но я все еще хочу знать, что случилось со вторым методом.

1 ответ1

1

Триммер фильтр не работает с HH:MM:SS в настоящее время. Укажите в секундах. Этот метод перекодирует видео, поэтому происходит снижение качества. Вы можете указать значение CRF, например, -crf 20 для контроля качества. Более низкие значения дают лучшее качество, но большие файлы. От 18 до 28 - достойный выбор.

Что касается второго метода, попробуйте, указав точки вырезания в текстовом файле, т.е.

file 'input.mp4'
duration 1560
file 'input.mp4'
inpoint 1980

а потом беги

ffmpeg -f concat -i input.txt -c copy -fflags +genpts -avoid_negative_ts make_zero output.mp4

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