Почему моё скомбинированное видео с использованием FFmpeg длиннее суммы входных видео?

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

Я объединил несколько видео с помощью этой команды 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, чтобы отобразить все потоки.

Рекомендации по исправлению

  1. Убедитесь, что все ваши исходные видео имеют одинаковый формат и настройки кодека. Используйте ffmpeg -i video.mp4 для получения информации о каждом видео.

  2. Если вы хотите точно сконкатенировать видео, попробуйте использовать -filter_complex "concat=n=3:v=1:a=1" вместо списка файлов. Это позволяет FFmpeg обрабатывать временные метки более корректно и предотвратить потенциальные проблемы.

  3. Рассмотрите возможность сокращения пустых кадров с помощью параметра -vf "trim" или просмотра на наличие ненужных пауз на границах видео.

Заключение

Объединение видеофайлов в FFmpeg может создаваться проблемы, связанные с временными метками и форматом. Необходимо тщательно следить за настройками потоков и кодеками, а также считать возможные пустоты в отдельных видеофайлах. Проверка времени и доработка команд помогут вам получить желаемый результат без увеличения общей длительности видео.

Если у вас есть дополнительные вопросы или требуется помощь в необходимости настроек, не стесняйтесь обращаться за поддержкой.

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

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