2016-06-17 7 views
1

У меня есть приложение 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, я очень хочу знать.

ответ

1

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

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

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

+0

Спасибо, это звучит многообещающе. Я проверю это. – mOfl