2

Следующие команды генерируют два видеоклипа H.264 по 10 секунд каждый с различными предустановленными параметрами (veryslow и очень veryfast) и объединяют их в один контейнер MP4.

$ ffmpeg -loglevel quiet -f rawvideo -pix_fmt rgba -s 1920x1080 -r 30 -i /dev/zero -pix_fmt yuv420p -c:v libx264 -preset:v veryslow -t 10 part1.mp4
$ ffmpeg -loglevel quiet -f rawvideo -pix_fmt rgba -s 1920x1080 -r 30 -i /dev/zero -pix_fmt yuv420p -c:v libx264 -preset:v veryfast -t 10 part2.mp4
$ cat list
file part1.mp4
file part2.mp4
$ ffmpeg -f concat -i list -c copy join.mp4

Все идет нормально. Но если я пытаюсь воспроизвести этот файл с помощью ffplay , я получаю много ошибок, таких как "decode_slice_header error", "недопустимое reordering_of_pic_nums_idc".

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

Означает ли это, что я не могу объединить два потока H.264, если они имеют разные параметры кодирования, даже если их размеры, частота кадров и форматы пикселей одинаковы?

2 ответа2

1

В общем, вы не можете.

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

Может существовать возможность объединять файлы в декодированном домене (например, с помощью фильтра concat), но определенно не на уровне необработанного потока битов. Это означает, что вы должны перекодировать после объединения.

То, что вы можете попытаться сделать, это объединить необработанные потоки:

ffmpeg -i part1.mp4 -c:v copy -an -f h264 part1.264
ffmpeg -i part2.mp4 -c:v copy -an -f h264 part2.264
cat part1.264 part2.s264 concat.264
ffmpeg -i concat.264 -c:v copy output.mp4

Но я не мог попробовать это сейчас, поэтому ваш пробег может отличаться.

0

Хотя спецификации H.264 и ISOBMFF имеют синтаксис, позволяющий изменять VPS/SPS/PPS во время потока, вполне вероятно, что один или оба

  • ffmpeg не ожидает этого и неправильно создает файл mp4
  • программное обеспечение для воспроизведения не может декодировать файл mp4, содержащий более одного набора SPS/PPS.

Если вы можете использовать MPEG TS вместо MP4, то посмотрите, можете ли вы соединить части в mpegts, а затем объединить два транспортных потока, чтобы сформировать окончательный вариант (cat part1.ts part2.ts > join.ts). TS-декодеры MPEG гораздо чаще включают логику для анализа изменения SPS/PPS.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .