У меня есть приложение OpenGL, изображения которого должны быть переданы через Интернет для мобильных клиентов. Раньше хватило просто записать рендеринг в видеофайл, который уже работает, и теперь это должно быть расширено для последующей потоковой передачи.Stream OpenGL framebuffer через HTTP (через FFmpeg)
Что работает прямо сейчас:
- Рендер сцены для объекта OpenGL фреймбуфера
- Захват содержимого с помощью FBO NvIFR
- закодировать его в формат H.264 с использованием NvENC (не требуется CPU туда и обратно)
- Скачать кодированный кадр для размещения памяти как массив байт
- Append этого кадра в видеофайл
Ни один из этих шагов не включает в себя FFmpeg или любую другую библиотеку. Теперь я хочу заменить последний шаг «Поток байтового массива текущего кадра через Интернет», и я предполагаю, что использование FFmpeg и FFserver было бы разумным выбором для этого. Я прав? Если нет, каков будет правильный путь?
Если да, то как я подхожу к этому в своем коде на C++? Как уже отмечалось, кадр уже закодирован. Кроме того, нет звука или другого материала, просто кодированный H.264 фрейм в виде массива байтов, который обновляется нерегулярно и должен быть преобразован в устойчивый поток видео. Я предполагаю, что это будет работа FFmpeg и что последующая потоковая передача через FFserver будет простой оттуда. Я не знаю, как перенести мои данные в FFmpeg в первую очередь, так как все обучающие программы FFmpeg, которые я нашел (в не исчерпывающем поиске), работают на файле или веб-камеру/устройстве захвата в качестве источника данных, а не на летучих данных в основная память.
Файл, упомянутый выше, который я уже могу создать, представляет собой поток файлов C++, к которому я добавляю каждый отдельный кадр, что означает, что разные кадры видео и рендеринга обрабатываются неправильно. В какой-то момент это нужно позаботиться.
Может ли кто-нибудь указать мне в правильном направлении? Могу ли я перенаправить данные из своего приложения в FFmpeg, чтобы создать надлежащую видеопотоку без записи на жесткий диск? Учебники очень ценятся. Кстати, FFmpeg/FFserver не является обязательным. Если у вас есть лучшая идея для потоковой передачи содержимого фреймбуфера OpenGL, я очень хочу знать.
Спасибо, это звучит многообещающе. Я проверю это. – mOfl