Я пытаюсь объединить (бок о бок) два потока живого видео, идущих по 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), но безрезультатно.