输出Java窗口作为网络摄像头流

时间:2012-06-07 20:31:57

标签: java ffmpeg streaming transparency webcam

我想在Java中编写一个可以在屏幕上显示动画叠加的程序。

然后,将使用名为x-split的单独程序通过互联网广播流式传输屏幕。

执行此操作的一个好方法是在java中创建一个透明窗口,它将显示动画文件(具有透明度),并且此窗口的输出(其显示)应理想地显示在网络摄像头设备列表中,以便它可以很容易通过x-split拾取,这将允许它被安排在我正在播放的游戏屏幕的顶部。

这种类型的示例程序将是显示网络摄像头图像的程序和"虚拟眼镜"覆盖在人脸的图像上,然后可以作为输出凸轮传输。

我找到了java 6u10-translucent-shapes库来创建透明窗口,但我不知道如何流式传输。

我已经阅读了一些内容,建议JMF和FFMpeg可能是要走的路,但我不确定要安装什么以及如何安装。

非常感谢任何帮助或指导教程。

3 个答案:

答案 0 :(得分:2)

我并不确切地知道你想要实现的目标,但是如何在屏幕上流动一个外部程序呢?类似http://screen-stream.en.softonic.com的内容?

答案 1 :(得分:1)

使用java.awt的Robot类。它有一个getScreenCapture(Rectangle)方法,可用于获取部分屏幕的BufferedImages。这些BufferedImages可以使用代码进行编辑,然后可以通过自动显示全屏幕应用程序进行闪烁(并消失以重新捕获新图像。)。或者,您可以使用上述方法使用透明的Java全屏应用程序对其进行过滤,并将其显示在您的applet上以进行“x-treamed”。

然而,我最大的问题是你如何期望控制你的游戏呢?另外,为什么你会期望能够轻松解决的问题。

如果您只是使用屏幕录制软件将其转换为电影,然后使用Windows Movie Maker根据您的需要对其进行修改,那么它会更简单,更方便。 您不需要浪费时间在代码上。 =)

我希望这有帮助。

答案 2 :(得分:1)

您可以创建一个未修饰的JFrameAWTUtilities类(我认为这是您在Java6u10中找到的Window透明度)并在那里完成所有动画。使用java.awt.Robot.getScreenCapture(Rectangle) x 毫秒捕获图像。使用javax.swing.Timer进行计时:

Timer timer = new Timer(x, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        arrayOfImages[imageCount] = java.awt.Robot.getScreenCapture(r);
        count++;
    }
});

我找到了一个Java包装器 - Jffmpeg - 来使用(http://jffmpeg.sourceforge.net/download.html)。您将需要JMF - http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html - 以及Jffmpeg文档页面中编写的其他一些内容。 FMJ(http://fmj-sf.net/ffmpeg-java/getting_started.php)是另一种选择。

需要使用FFmpeg

下载

Git

最后,来自另一个论坛(http://www.blackhatworld.com/blackhat-seo/youtube/330165-command-line-program-convert-image-video.html)的这个帖子在某种程度上向您展示了如何将保存的图像转换为视频。 您可能想要跳过Jffmeg步骤altogther。相反,您可以将所有图像保存到文件,并使用Runtime.getRuntime()。exec(String)将其转换为视频以执行命令行。但是,如果你这样做,你将无法使你的程序独立于平台

Java中的视频有点乏味且烦人,因此您可能希望切换到另一种语言,使用更简单的库和API。