Как точно разделить и объединить видео с помощью ffmpeg, учитывая inpoint/outpoint.

Вопрос или проблема

Я учусь разделять и комбинировать видео с помощью ffmpeg. В данный момент я практикуюсь на MP4 размером 799 КБ, one_through_ten-timestamped.mp4, где каждый кадр имеет встроенный “номер кадра” (до кадра 40 встроенный номер увеличивается только на каждом втором кадре).

Команда, которую я использую, выглядит так:

ffmpeg -f concat -i one_through_ten_edit_list.txt -c copy one_through_ten_edited.mp4

Где one_through_ten_edit_list.txt содержит:

file one_through_ten-timestamped.mp4
inpoint 00:00:01.500
outpoint 00:00:05.000
file one_through_ten-timestamped.mp4
inpoint 00:00:09.500
outpoint 00:00:13.000

Когда я выполняю эту команду в ffmpeg, выходное видео имеет несколько проблем:

  1. Выход начинается с самого начала исходного видео, а не с 1,5 секунды.
  2. Аудио после второго соединенного видео задерживается (при воспроизведении в QuickTime Player. С ffplay проблем нет).

Когда я выполняю те же самые правки в MPEG Streamclip, результирующее видео воспроизводится как ожидается. Вот некоторый табличный вывод из ffprobe для one_through_ten-timestamped.mp4, который показывает, где видео из ffmpeg и MPEG Streamclip отличаются по точкам конкатенации:

начало первого сегмента
конец первого сегмента
начало первого сегмента MPEG Streamclip
начало второго сегмента
конец второго сегмента

Обратите внимание, что ffmpeg и MPEG Streamclip обрабатывают второй сегмент примерно одинаково, однако ffmpeg похоже не учитывает inpoint в первом входном видео. Обратите внимание, что в моем MP4 есть один пакет на кадр.

ffmpeg ведет себя таким образом с версии 2.8 (возможно, и раньше) вплоть до 3.3.3. Неужели я пропустил какую-то команду или опцию в списке редактирования? Наверняка другие успешно используют ffmpeg для разделения и объединения видео (без повторного сжатия).

Вы можете попробовать добавить -async 1

ffmpeg -f concat -async 1 -safe 0 -i one_through_ten_edit_list.txt -c copy one_through_ten_edited.mp4

Ответ или решение

Для точного разбиения и комбинирования видео с помощью ffmpeg, соблюдая заданные точки входа (inpoint) и выхода (outpoint), необходимо использовать несколько ключевых параметров и правильно сформировать список редактирования. Вот пошаговое руководство решения вашей задачи.

Первая часть: Разбиение видео

ffmpeg не поддерживает точки входа и выхода непосредственно в файле для конкатенации (concat). Вместо этого вам придется использовать команды trim для разбивки видео. Например:

  1. Используйте команду trim для создания отдельных сегментов видео, сохраняемых во временные файлы. Вот пример команды для вашего первого сегмента:

    ffmpeg -i one_through_ten-timestamped.mp4 -ss 00:00:01.500 -to 00:00:05.000 -c copy segment1.mp4
  2. Затем создайте второй сегмент:

    ffmpeg -i one_through_ten-timestamped.mp4 -ss 00:00:09.500 -to 00:00:13.000 -c copy segment2.mp4

Теперь у вас есть два отдельных файла: segment1.mp4 и segment2.mp4.

Вторя часть: Конкатенация

Теперь, когда у вас есть несколько сегментов, вы можете создать текстовый файл списка для конкатенации:

  1. Создайте файл one_through_ten_edit_list.txt с содержимым:

    file 'segment1.mp4'
    file 'segment2.mp4'
  2. Выполните команду для соединения оба сегмента:

    ffmpeg -f concat -safe 0 -i one_through_ten_edit_list.txt -c copy one_through_ten_edited.mp4

Возможные проблемы

Как вы заметили, иногда речь идет о синхронизации аудио и видео. Если синхронизация не работает, попробуйте добавить опцию -async:

ffmpeg -f concat -safe 0 -i one_through_ten_edit_list.txt -c copy -async 1 one_through_ten_edited.mp4

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...