У меня есть приложение OpenGL, из которого рендеринг изображений нужно передавать по Интернету мобильным клиентам. Раньше было достаточно просто записать рендеринг в видеофайл, который уже работает, и теперь это должно быть расширено для последующей потоковой передачи.
Что работает прямо сейчас:
Пока ни один из этих шагов не включает FFmpeg или любую другую библиотеку. Теперь я хочу заменить последний шаг на «Поток байтового массива текущего кадра через Интернет», и я предполагаю, что использование FFmpeg и FFserver было бы разумным выбором для этого. Я прав? Если нет, то что будет правильным?
Если да, то как мне подойти к этому в моем C ++ коде? Как указано, кадр уже закодирован. Кроме того, нет звука или чего-то другого, просто кодированный H.264 кадр в виде байтового массива, который обновляется нерегулярно и должен быть преобразован в устойчивый видеопоток. Я предполагаю, что это будет работа FFmpeg и что последующая потоковая передача через FFserver будет простой оттуда. Чего я не знаю, так это как в первую очередь передать мои данные в FFmpeg, так как все учебники по FFmpeg, которые я обнаружил (в неисчерпывающем поиске), работают с файлом или веб-камерой / устройством захвата в качестве источника данных, а не с изменяющимися данными в основная память.
Упомянутый выше файл, который я уже могу создать, является потоком файлов C ++, к которому я добавляю каждый отдельный кадр, что означает, что различные частоты кадров видео и рендеринга обрабатываются неправильно. Об этом также нужно позаботиться в какой-то момент.
Может ли кто-нибудь указать мне правильное направление? Могу ли я пересылать данные из моего приложения в FFmpeg для создания правильного видеопотока без записи на жесткий диск? Учебники очень ценятся. Кстати FFmpeg / FFserver не является обязательным. Если у вас есть лучшая идея для потоковой передачи содержимого кадрового буфера OpenGL, я хочу знать.
Вы можете передать процессу 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
,
Других решений пока нет …