Вопрос или проблема
Я учусь разделять и комбинировать видео с помощью 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,5 секунды.
- Аудио после второго соединенного видео задерживается (при воспроизведении в QuickTime Player. С
ffplay
проблем нет).
Когда я выполняю те же самые правки в MPEG Streamclip, результирующее видео воспроизводится как ожидается. Вот некоторый табличный вывод из ffprobe
для one_through_ten-timestamped.mp4
, который показывает, где видео из ffmpeg
и 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
для разбивки видео. Например:
-
Используйте команду
trim
для создания отдельных сегментов видео, сохраняемых во временные файлы. Вот пример команды для вашего первого сегмента:ffmpeg -i one_through_ten-timestamped.mp4 -ss 00:00:01.500 -to 00:00:05.000 -c copy segment1.mp4
-
Затем создайте второй сегмент:
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
.
Вторя часть: Конкатенация
Теперь, когда у вас есть несколько сегментов, вы можете создать текстовый файл списка для конкатенации:
-
Создайте файл
one_through_ten_edit_list.txt
с содержимым:file 'segment1.mp4' file 'segment2.mp4'
-
Выполните команду для соединения оба сегмента:
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
предлагает мощные инструменты для работы с видео, и, хотя некоторые операции требуют дополнительных шагов, это дает вам полный контроль над процессом. Убедитесь, что используете правильные метки времени и проверяете результаты каждого этапа, чтобы избежать ошибок в синхронизации.