Потоковая передача фреймбуфера OpenGL через HTTP (через FFmpeg)

У меня есть приложение OpenGL, визуализированные изображения которого необходимо передавать через Интернет мобильным клиентам. Раньше достаточно было просто записать рендеринг в видеофайл, который уже работает, а теперь это нужно распространить на последующий стриминг.

Что сейчас работает:

  • Визуализировать сцену в объект фреймбуфера OpenGL
  • Захват содержимого FBO с помощью NvIFR
  • Закодируйте его в H.264 с помощью NvENC (ЦП туда и обратно не требуется)
  • Загрузите закодированный кадр в память хоста в виде байтового массива
  • Добавить этот кадр в видео файл

Ни один из этих шагов пока не задействует FFmpeg или любую другую библиотеку. Теперь я хочу заменить последний шаг на «Потоковую передачу байтового массива текущего кадра через Интернет», и я предполагаю, что использование FFmpeg и FFserver было бы разумным выбором для этого. Я прав? Если нет, что было бы правильным способом?

Если да, то как мне подойти к этому в моем коде C ++? Как уже отмечалось, кадр уже закодирован. Кроме того, нет звука или другого материала, просто закодированный кадр H.264 в виде массива байтов, который обновляется нерегулярно и должен быть преобразован в устойчивый видеопоток. Я предполагаю, что это будет работа FFmpeg и что последующая потоковая передача через FFserver будет простой оттуда. Я не знаю, как в первую очередь передавать мои данные в FFmpeg, поскольку все найденные мной учебники FFmpeg (при неполном поиске) работают с файлом или устройством веб-камеры / захвата в качестве источника данных, а не с изменчивыми данными в основная память.

Упомянутый выше файл, который я уже могу создать, представляет собой файловый поток C ++, к которому я добавляю каждый отдельный кадр, что означает, что разные частоты кадров видео и рендеринга обрабатываются неправильно. Об этом тоже нужно позаботиться в какой-то момент.

Может ли кто-нибудь указать мне правильное направление? Могу ли я пересылать данные из моего приложения в FFmpeg для создания правильного видеопотока без записи на жесткий диск? Учебники очень ценятся. Кстати FFmpeg / FFserver не является обязательным. Если у вас есть лучшая идея для потоковой передачи содержимого фреймбуфера OpenGL, я очень хочу знать.


person mOfl    schedule 17.06.2016    source источник


Ответы (1)


Вы можете передать процессу ffmpeg легко закодированные данные H.264 (-f h264) и указать ему просто скопировать поток в выходной мультиплексор (-c:v copy). Чтобы фактически получить данные в ffmpeg, просто запустите его как дочерний процесс с конвейером, подключенным к его стандартному вводу, и укажите стандартный ввод в качестве источника чтения.

FILE *ffmpeg_in = popen("ffmpeg -i /dev/stdin -f h264 -c copy ...", "w");

затем вы можете записать закодированный поток h264 в ffmpeg_in.

person datenwolf    schedule 17.06.2016
comment
Спасибо, это звучит многообещающе. Я это проверю. - person mOfl; 17.06.2016