Вопрос или проблема
Формулировка проблемы
Я пытался решить эту проблему: 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 и как можно её устранить.
Причины проблемы
-
Проблемы с DTS и PTS
Одной из основных причин возникновения ошибки является нарушение временной последовательности DTS (Decoding Timestamp) и PTS (Presentation Timestamp) во время обработки видеофайлов. Если временные метки отдельных потоков не упорядочены должным образом, это приводит к ошибкам во время мультиплексирования. -
Разное число потоков
При использовании команды-map
нужно убедиться, что количество и порядок потоков в обоих файлах совпадают. Если один файл, например, содержит больше аудиопотоков, чем другой, это также может вызвать ошибку при попытке их объединения. -
Несоответствие форматов потоков
Хотя оба видеофайла могут быть в формате MP4, их кодеки, разрешения или параметры сжатия могут различаться. Это также может привести к проблемам при объединении. -
Ошибки в командах FFmpeg
Использование неправильных команд или параметров в FFmpeg может также вызвать проблемы. Например, если указаны ненужные или неправильные параметры, они могут исказить обработку.
Решения
-
Проверка временных меток
Перед объединением видеофайлов проверьте их временные метки с помощью команды:ffprobe a.MP4 ffprobe b.MP4
Это позволяет узнать, как обработаны временные метки в каждом файле.
-
Использование правильных параметров
-map
Если вы знаете, сколько потоков (видео и аудио) содержится в каждом файле, убедитесь, что порядок и количество потоков в командах-map
соответствуют друг другу. Например, еслиa.MP4
имеет 3 аудиопотока и 1 видеопоток, аb.MP4
только один, следует корректно указать-map
для соответствующих потоков. -
Стандартизация потоков
Если ваши файлы имеют разные настройки, стандартизируйте их перед объединением. Для этого можно использовать команду: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
Это конвертирует оба файла в одинаковый кодек и параметры, что улучшит результаты объединения.
-
Исправление временных меток
При необходимости можно исправить 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
-
Проверка на наличие ошибок
Прежде чем пробовать объединение, вы можете провести проверку видео на ошибки с помощью:ffmpeg -v error -i a.MP4 -f null - ffmpeg -v error -i b.MP4 -f null -
Заключение
Ошибки при объединении видеофайлов с помощью FFmpeg, такие как "Error muxing a packet", могут быть вызваны различиями в временных метках, количестве потоков и формате. Следуя представленным рекомендациям, вы сможете устранить эти проблемы и успешно соединить ваши GoPro видео в один файл. Помните, что тщательная предварительная проверка и стандартизация параметров видео помогут избежать множества неприятностей в будущем.