我有一个OpenGL应用程序,其渲染图像需要通过互联网流式传输到移动客户端。以前,只需将渲染记录到已经正常工作的视频文件中就足够了,现在这应该扩展到后续的流媒体。
现在正在发挥作用:
到目前为止,这些步骤都不涉及FFmpeg或任何其他库。我现在想用“通过互联网传输当前帧的字节数组”替换最后一步,我假设使用FFmpeg和FFserver是一个合理的选择。我对么?如果没有,那么正确的方法是什么?
如果是这样,我如何在我的C ++代码中处理这个问题?正如所指出的,帧已经被编码。此外,没有声音或其他东西,只是作为字节数组的H.264编码帧,不规则地更新并应转换为稳定的视频流。我认为这将是FFmpeg的工作,并且随后通过FFserver进行的流式传输将很简单。我不知道的是如何首先将我的数据提供给FFmpeg,因为我发现的所有FFmpeg教程(在非详尽的搜索中)都作为数据源在文件或网络摄像头/捕获设备上工作,而不是在主记忆。
我已经能够创建的上述文件是一个C ++文件流,我将每个帧附加到该文件流,这意味着不能正确处理视频和渲染的不同帧速率。这也需要在某个时候处理。
有人能指出我正确的方向吗?我可以将数据从我的应用程序转发到FFmpeg以构建正确的视频源而无需写入硬盘吗?非常感谢教程。顺便说一句FFmpeg / FFserver不是强制性的。如果您对OpenGL帧缓冲内容的流式传输有更好的了解,我很想知道。
答案 0 :(得分:1)
您可以为ffmpeg进程提供容易编码的H.264数据( Set<String> handles = driver.getWindowHandles(); // get all window handles
Iterator<String> iterator = handles.iterator();
while (iterator.hasNext()){
subWindowHandler = iterator.next();
}
driver.switchTo().window(subWindowHandler); // switch to popup window
System.out.println(driver.getTitle()); // perform operations on popup
Thread.sleep(3000);
Robot r=new Robot();
r.keyPress(KeyEvent.VK_ALT);
r.keyPress(KeyEvent.VK_F4);
r.keyRelease(KeyEvent.VK_F4);
r.keyRelease(KeyEvent.VK_ALT);
driver.switchTo().window(parentWindowHandler); // switch back to parent window
System.out.println(driver.getTitle());
),并告诉它只需将流复制到输出多路复用器(-f h264
)。要将数据实际存入ffmpeg,只需将其作为子进程启动,并将管道连接到其stdin,并将stdin指定为读取源
-c:v copy
然后,您可以将编码的h264流写入FILE *ffmpeg_in = popen("ffmpeg -i /dev/stdin -f h264 -c copy ...", "w");
。