FFmpeg: “Ошибка мультиплексирования пакета” при попытке объединить два видео с GoPro. Почему?

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

Формулировка проблемы

Я пытался решить эту проблему: FFmpeg искажается оригинальный порядок потоков a.MP4 при выполнении:

ffmpeg -sseof -1 -i a.MP4 -map 0:v -map 0:a -map 0:3 -c copy -copy_unknown a_last_1_second.MP4

Это приводит к тому, что моя попытка объединить два видео GoPro без потерь с помощью этой команды FFmpeg терпит неудачу:

ffmpeg -safe 0 -f concat -i "list_videos.txt" -map 0:v -map 0:a -map 0:2 -copy_unknown -c copy "ab.mp4"

в то время как list_videos.txt содержит:

file 'a.MP4'
file 'b.MP4'

так как a_last_1_second.mp4 и b.MP4 не имеют одинакового порядка потоков.


Моя неудачная попытка решения

Решение, которое я пытался реализовать, основывается на следующей логике: давайте используем FFmpeg, чтобы также испортить оригинальный порядок потоков b.MP4, чтобы оба файла a.MP4 и b.MP4 имели одинаково испорченный порядок потоков для обеспечения плавного объединения.

Пример: я буду использовать этот видеофайл GoPro (18.5 MiB), который будет как a.MP4, так и b.MP4, чтобы упростить тестирование.

Шаг 1: извлечь последнюю секунду из a.MP4:

ffmpeg -sseof -1 -i a.MP4 -map 0:v -map 0:a -map 0:3 -c copy -copy_unknown a_only_the_last_1sec.MP4

Шаг 2: Поскольку FFmpeg искажается оригинальный порядок потоков a.MP4, мы можем полагаться на FFmpeg, что он также испортит оригинальный порядок потоков b.MP4 (в противном случае объединение может не сработать из-за различных порядков потоков):

ffmpeg -i "b.mp4" -map 0:v -map 0:a -map 0:3 -copy_unknown -c copy "b_with_messed_up_stream_order.mp4"

Шаг 3: объединить b_with_messed_up_stream_order.mp4 и a_only_the_last_1sec.MP4:

ffmpeg -safe 0 -f concat -i "list_videos.txt" -map 0:v -map 0:a -map 0:2 -copy_unknown -c copy "ab.mp4"

где list_videos.txt содержит:

b_with_messed_up_stream_order.mp4
a_only_the_last_1sec.MP4

Проверено с ffmpeg version 7.1-full_build-www.gyan.dev на Windows 10 Pro 21H2.

Однако, когда я пытаюсь объединить b_with_messed_up_stream_order.mp4 и a_only_the_last_1sec.MP4, я получаю эту ошибку:

[concat @ 00000170886fbc00] DTS 59062 < 86086 out of order
[aost#0:1/copy @ 0000017088c6fd00] Non-monotonic DTS; previous: 137216, current: 95109; changing to 137217. This may result in incorrect timestamps in the output file.
[mp4 @ 0000017088c6f040] Application provided invalid, non monotonically increasing dts to muxer in stream 2: 2002 >= 1902
[dost#0:2/copy @ 0000017088777e40] Error submitting a packet to the muxer: Invalid argument
    Last message repeated 1 times
[out#0/mp4 @ 0000017088de77c0] Error muxing a packet
[out#0/mp4 @ 0000017088de77c0] Task finished with error code: -22 (Invalid argument)
[out#0/mp4 @ 0000017088de77c0] Terminating thread with return code -22 (Invalid argument)
[out#0/mp4 @ 0000017088de77c0] video:18878KiB audio:67KiB subtitle:0KiB other streams:26KiB global headers:0KiB muxing overhead: unknown
frame=   87 fps=0.0 q=-1.0 Lsize=   18969KiB time=00:00:02.06 bitrate=75113.0kbits/s speed=12.7x
Конвертация не удалась!

Почему?

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

Ошибка "Error muxing a packet" при объединении видео GoPro с помощью FFmpeg: причины и решение

Введение

В процессе работы с видеофайлами часто возникает необходимость их объединения. Особенно если файлы имеют одинаковый кодек и формат, это можно сделать с минимальными потерями качества. Однако, как показывает опыт, даже этот процесс может столкнуться с непредвиденными трудностями, такими как ошибка "Error muxing a packet" в FFmpeg. Рассмотрим подробнее, почему возникает эта ошибка при попытке объединить видеофайлы GoPro и как можно её устранить.

Причины проблемы

  1. Проблемы с DTS и PTS
    Одной из основных причин возникновения ошибки является нарушение временной последовательности DTS (Decoding Timestamp) и PTS (Presentation Timestamp) во время обработки видеофайлов. Если временные метки отдельных потоков не упорядочены должным образом, это приводит к ошибкам во время мультиплексирования.

  2. Разное число потоков
    При использовании команды -map нужно убедиться, что количество и порядок потоков в обоих файлах совпадают. Если один файл, например, содержит больше аудиопотоков, чем другой, это также может вызвать ошибку при попытке их объединения.

  3. Несоответствие форматов потоков
    Хотя оба видеофайла могут быть в формате MP4, их кодеки, разрешения или параметры сжатия могут различаться. Это также может привести к проблемам при объединении.

  4. Ошибки в командах FFmpeg
    Использование неправильных команд или параметров в FFmpeg может также вызвать проблемы. Например, если указаны ненужные или неправильные параметры, они могут исказить обработку.

Решения

  1. Проверка временных меток
    Перед объединением видеофайлов проверьте их временные метки с помощью команды:

    ffprobe a.MP4
    ffprobe b.MP4

    Это позволяет узнать, как обработаны временные метки в каждом файле.

  2. Использование правильных параметров -map
    Если вы знаете, сколько потоков (видео и аудио) содержится в каждом файле, убедитесь, что порядок и количество потоков в командах -map соответствуют друг другу. Например, если a.MP4 имеет 3 аудиопотока и 1 видеопоток, а b.MP4 только один, следует корректно указать -map для соответствующих потоков.

  3. Стандартизация потоков
    Если ваши файлы имеют разные настройки, стандартизируйте их перед объединением. Для этого можно использовать команду:

    ffmpeg -i a.MP4 -c:v libx264 -c:a aac -strict experimental -b:a 192k a_fixed.MP4
    ffmpeg -i b.MP4 -c:v libx264 -c:a aac -strict experimental -b:a 192k b_fixed.MP4

    Это конвертирует оба файла в одинаковый кодек и параметры, что улучшит результаты объединения.

  4. Исправление временных меток
    При необходимости можно исправить DTS и PTS с помощью флага -fflags +genpts:

    ffmpeg -i a.MP4 -c copy -fflags +genpts a_fixed.MP4
    ffmpeg -i b.MP4 -c copy -fflags +genpts b_fixed.MP4
  5. Проверка на наличие ошибок
    Прежде чем пробовать объединение, вы можете провести проверку видео на ошибки с помощью:

    ffmpeg -v error -i a.MP4 -f null -
    ffmpeg -v error -i b.MP4 -f null -

Заключение

Ошибки при объединении видеофайлов с помощью FFmpeg, такие как "Error muxing a packet", могут быть вызваны различиями в временных метках, количестве потоков и формате. Следуя представленным рекомендациям, вы сможете устранить эти проблемы и успешно соединить ваши GoPro видео в один файл. Помните, что тщательная предварительная проверка и стандартизация параметров видео помогут избежать множества неприятностей в будущем.

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

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