Потоковый кадровый буфер 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, я хочу знать.

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,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]