Объединение двух живых потоков RTMP в другой поток RTMP, проблемы синхронизации (с FFMPEG) - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь объединить (бок о бок) два потока живого видео, идущих по RTMP, используя следующую команду ffmpeg:

ffmpeg -i "rtmp://first" -i "rtmp://first" -filter_complex "[0v][1v]xstack=inputs=2:layout=0_0|1920_0[stacked]" -map "[stacked]" -preset ultrafast -vcodec libx264 -tune zerolatency -an -f flv output.flv

В этом примере я фактически использую один и тот же входной поток два раза, потому что проблема более заметна таким образом. И проблема в том, что два потока не синхронизированы c примерно на 2-3 секунды. То есть - я ожидаю (так как у меня два одинаковых входа) будет иметь одинаковые левую и правую стороны на выходе. Вместо этого - левая сторона находится позади правой стороны на 2-3 секунды.

Я думаю, что происходит то, что ffmpeg подключается к входам по порядку (я вижу это в выходном журнале), и подключение к каждому из них занимает 2-3 секунды. (возможно, он ожидает I-кадра, эти потоки имеют интервал I-кадра 3 секунды). Затем, вероятно, он буферизует кадры, полученные с первого (уже подключенного) входа, при подключении ко второму. Когда подключен второй и кадры с обоих входов готовы к пропуску через фильтр - первый входной буфер уже содержит 2-3 секунды видео - и результат не синхронизирован c.

Опять же, это только мои предположения. Итак, как можно достичь моей цели? В основном я хочу, чтобы ffmpeg отбрасывал все «старые» кадры, полученные до того, как оба входа были подключены, ИЛИ как-то помещал «пустые» (черные?) Кадры для второго входа, ожидая, когда этот второй вход станет доступным. Я пытался играть с различными флагами, с PTS (фильтр setpts), но безрезультатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...