Java中的屏幕共享

代码纪元 2022 2022-11-04

了解如何使用 Java、Node.js 和 JxBrowser 构建屏幕共享应用程序。

远程屏幕共享用于各种应用程序和服务,从网络会议到远程访问应用程序。二线工程师可以使用它来协助一线的同事,或者技术支持专家可以使用它来准确了解到客户的故障现象。

你可以使用 TeamViewer 、Todesk、向日葵等第三方应用程序。但是,如果你需要在 Java 应用程序中拥有远程访问功能怎么办?在本文中,将展示一种方法,该方法允许使用JxBrowser的功能在不同 PC 上运行的两个 Java 应用程序之间实现屏幕共享。

JxBrowser 是一个跨平台的 Java 库,可让将基于 Chromium 的 Web 浏览器控件集成到 Java Swing、JavaFX、SWT 应用程序中,并使用数百种 Chromium 功能。

为了在 Java 中实现屏幕共享,将利用 Chromium 支持即时使用的屏幕共享和 JxBrowser 提供对它的编程访问这一功能。

概述

该项目由两部分组成:Node.js 上的服务器和两个 Java 应用程序。

服务端通过WebRTС 服务器来实现。这一部分包含用于连接到服务器和启动屏幕共享会话的 JavaScript 代码。

Java 客户端是两个桌面应用程序。第一个是带有按钮的窗口。单击该按钮开始共享会话。第二个应用程序自动接收视频流并显示它。还有一个停止屏幕共享的按钮。

Java中的屏幕共享

WebRTC 服务器

WebRTC 服务器配置为用于两个客户端之间的交互:一个流媒体和一个接收器。它分别服务于两个静态页面streamer.html``receiver.html

const app = express();

app.use(express.static('public'));

app.get('/streamer', (req, res) => {
   res.sendFile(rootPath + 'public/streamer.html');
});

app.get('/receiver', (req, res) => {
   res.sendFile(rootPath + 'public/receiver.html');
});
复制代码

每个 HTML 文件都包含连接到服务器并通过 WebRTC 设置屏幕共享的 JavaScript 代码。当流媒体开始捕获时,我们将其屏幕视图作为视频流接收。为了显示它,我们在接收器端使用内置的 HTML5 视频播放器。

Java中的屏幕共享

打开两个浏览器窗口查看是否正常。

Java中的屏幕共享

该项目的源代码可在GitHub 上获得。

Java 客户端

接下来配置 Java 客户端并将它们与 JavaScript 应用程序集成。需要初始化一个空的Gradle 项目并使用JxBrowser Gradle Plug-in添加JxBrowser依赖项。

plugins {
   …
   id("com.teamdev.jxbrowser.gradle") version "0.0.3"
}

jxbrowser {
   version = "7.24"
}

dependencies {
   // Detects the current platform and adds the corresponding Chromium binaries. 
   implementation(jxbrowser.currentPlatform())

   // Adds a dependency to Swing integration.
   implementation(jxbrowser.swing())
}
复制代码

流媒体应用

接下来从一个将共享其屏幕的应用程序开始,需要代表流媒体连接到服务器。首先,需要创建EngineBrowser实例:

Engine engine = Engine.newInstance(HARDWARE_ACCELERATED);
Browser browser = engine.newBrowser();
复制代码

加载所需的 URL:

browser.navigation().loadUrlAndWait("http://localhost:3000/streamer");

复制代码

加载 URL 后,访问JavaScript 代码streamer.html,可以在单击按钮时直接从 Java 开始屏幕共享:

JButton startSharingButton = new JButton("Share your screen");

startSharingButton.addActionListener(e -> {
   browser.mainFrame().ifPresent(mainFrame ->    
       mainFrame.executeJavaScript("startScreenSharing()"));
});
复制代码

默认情况下,当网页想要从屏幕捕获视频时,Chromium 会显示一个对话框,我们可以在其中选择捕获源。使用 JxBrowser API,我们可以在代码中选择捕获源:

browser.set(StartCaptureSessionCallback.class, (params, tell) -> {
    CaptureSources sources = params.sources();
    // Share the entire screen.
    CaptureSource screen = sources.screens().get(0);
    tell.selectSource(screen, AudioCaptureMode.CAPTURE);
});
复制代码

让我们保存CaptureSession的实例,以便稍后以编程方式停止它。

private CaptureSession captureSession;
…
browser.on(CaptureSessionStarted.class, event -> 
    captureSession = event.capture()
);
复制代码

为此我们还需要一个按钮:

JButton stopSharingButton = new JButton("Stop sharing");
stopSharingButton.addActionListener(e -> {
   captureSession.stop();
});
复制代码

接收器应用程序

在接收器应用程序中,我们将显示共享屏幕。

就像在流媒体应用程序中一样,我们需要连接到 WebRTC 服务器,但这次是作为接收器。因此,创建EngineBrowser实例,并导航到接收者的 URL:

Engine engine = Engine.newInstance(HARDWARE_ACCELERATED);
Browser browser = engine.newBrowser();
browser.navigation().loadUrlAndWait("http://localhost:3000/receiver");
复制代码

要在 Java 应用程序中显示流媒体屏幕,创建 SwingBrowserView组件并将其嵌入到JFrame

private static void initUI(Browser browser) {
   BrowserView view = BrowserView.newInstance(browser);

   JFrame frame = new JFrame("Receiver");
   frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
   frame.setSize(700, 500);
   frame.add(view, BorderLayout.CENTER);
   frame.setLocationRelativeTo(null);
   frame.setVisible(true);
}
复制代码

该组件将使用HTML5BrowserView视频播放器显示加载网页的内容,我们将能够看到流媒体的屏幕。

Java中的屏幕共享

结论

在本文中,展示了如何在一个 Java 应用程序中共享屏幕并使用 JxBrowser 在另一个应用程序中显示它。我创建了一个可以共享屏幕的简单 JavaScript 应用程序。然后使用 JxBrowser 将它集成到两个 Swing 应用程序中。借助 JxBrowser 提供的捕获 API,丰富了标准 Java 应用程序的屏幕共享功能。

Apipost 私有化火热进行中

评论