Обрезка и объединение медиа-файлов с помощью ffmpeg

1589
Anmol Singh Jaggi

Я пытаюсь удалить сегмент (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 

Вывод команды: Link (Ошибка упоминается в строке 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 

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

0
В методе `seek`, почему индикатор длительности` -t` во 2-й команде? Gyan 8 лет назад 0
@Mulvya Определяет продолжительность отсечения. Теперь, когда вы упомянули это, я вижу, что допустил небольшую ошибку: вместо `-t 00: 53: 50` во второй команде это должен был быть` -t 00: 21: 20`. Anmol Singh Jaggi 8 лет назад 0
@Mulvya Даже после исправления я получаю ту же ошибку. Алос, я исправил это вопрос. Anmol Singh Jaggi 8 лет назад 0
`trim` не работает с HH: MM: SS [в настоящее время] (http://superuser.com/q/1061274/114058). Укажите в секундах. И что я имел в виду, так как вы хотите, чтобы файл был до конца, за исключением части в середине, нет необходимости указывать `t` во второй команде. Если ошибка все еще сохраняется, скопируйте весь файл в новый контейнер и попробуйте снова: `ffmpeg -i input -c copy new.mp4` Gyan 8 лет назад 0
Хорошо, я понял, что ты пытаешься сказать. Я отредактировал вопрос соответственно. Anmol Singh Jaggi 8 лет назад 0
@Mulvya Я попробовал то же самое после копирования в новый контейнер, но получаю ту же ошибку. Anmol Singh Jaggi 8 лет назад 0
Другая потенциальная полезная информация: сегмент, который я пытаюсь удалить, выглядит поврежденным; видео кажется застрявшим в одном кадре с увеличением времени. Anmol Singh Jaggi 8 лет назад 0
@Mulvya Проверьте правки в вопросе. Есть ли у вас какие-либо идеи относительно второго метода? Anmol Singh Jaggi 8 лет назад 0
Кроме того, у меня есть еще один вопрос: приводит ли какой-либо из этих методов к снижению качества выходного видео? Anmol Singh Jaggi 8 лет назад 0

1 ответ на вопрос

1
Gyan

Триммер фильтр не работает с 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 
Спасибо за совет относительно качества. Что касается второго метода, он все еще не работает. Выходной файл вообще не содержит второго видео. Его размер практически аналогичен первому видео. [Здесь] (http://pastebin.com/ZMCEDPwj) - это журнал. Anmol Singh Jaggi 8 лет назад 0
Извините, список concat должен ссылаться на весь входной файл. Gyan 8 лет назад 0
Хорошо, я тоже это попробовал, но я получаю ту же ошибку `input.txt: Invalid аргумент`, при этом второй видеофайл отсутствует в выходном файле. Anmol Singh Jaggi 8 лет назад 0

Похожие вопросы