Вопрос или проблема
Я объединил несколько видео с помощью этой команды FFmpeg:
ffmpeg -safe 0 -f concat -i "list_videos.txt" -map 0:v -map 0:a -map 0:3 -copy_unknown -tag:2 gpmd -c copy "abc.mp4"
в list_videos.txt
содержится:
file 'a.MP4'
file 'b.MP4'
file 'c.MP4'
к моему удивлению, abc.mp4
значительно длиннее суммы длин a.MP4
, b.MP4
, 'c.MP4
:
В чем проблема?
Ответ или решение
Для начала, давайте разберёмся, почему ваш окончательный видеоролик, созданный с помощью FFmpeg, оказался длиннее суммарной длительности исходных видеофайлов, указанных в вашем списке list_videos.txt
. Причины могут варьироваться, и я опишу основные из них.
1. Кодировка и особенности формата
Когда вы используете команду -c copy
, вы фактически не перекодируете видео; вы просто копируете потоки в новый файл. Это может привести к возникновению различий в временной метке начального и конечного времени в сравнении с исходными файлами. Если одно из ваших исходных видео имеет дополнительные ненужные кадры или временные метки, это может увеличить общую продолжительность.
2. Временные метки (PTS и DTS)
Видеофайлы обычно имеют механизмы управления временными метками — PTS (Presentation Time Stamp) и DTS (Decoding Time Stamp). Если временные метки исходных видеофайлов не совпадают или неправильно выставлены, FFmpeg может интерпретировать это как продлённое время воспроизведения. Обратите внимание на наличие новых ключевых кадров и кадров с промежуточной информацией в ходе объединения файлов.
3. Наличие пустот между видео
Вы могли случайно оставить пустоты или «паузы» между вашими видеофайлами. Проверьте конец каждого из ваших файлов, так как иногда кодеки добавляют время в виде пустых кадров. Для устранения этой проблемы вы можете использовать опцию -avoid_negative_ts 1
, чтобы сбалансировать временные метки.
4. Ошибки в самой команде
Ваша команда использует -map 0:3
, что указывает на третий поток. Однако если ваш входной файл не содержит такого числа потоков (например, аудио и видео), это может привести к сбоям в обработке. Для простого объединения видео полезно использовать только -map 0
, чтобы отобразить все потоки.
Рекомендации по исправлению
-
Убедитесь, что все ваши исходные видео имеют одинаковый формат и настройки кодека. Используйте
ffmpeg -i video.mp4
для получения информации о каждом видео. -
Если вы хотите точно сконкатенировать видео, попробуйте использовать
-filter_complex "concat=n=3:v=1:a=1"
вместо списка файлов. Это позволяет FFmpeg обрабатывать временные метки более корректно и предотвратить потенциальные проблемы. -
Рассмотрите возможность сокращения пустых кадров с помощью параметра
-vf "trim"
или просмотра на наличие ненужных пауз на границах видео.
Заключение
Объединение видеофайлов в FFmpeg может создаваться проблемы, связанные с временными метками и форматом. Необходимо тщательно следить за настройками потоков и кодеками, а также считать возможные пустоты в отдельных видеофайлах. Проверка времени и доработка команд помогут вам получить желаемый результат без увеличения общей длительности видео.
Если у вас есть дополнительные вопросы или требуется помощь в необходимости настроек, не стесняйтесь обращаться за поддержкой.