持续创作,加快生长!这是我参加「掘金日新方案 10 月更文挑战」的第31天,点击检查活动详情
了解如何运用 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 客户端是两个桌面运用程序。第一个是带有按钮的窗口。单击该按钮开始同享会话。第二个运用程序主动接纳视频流并显现它。还有一个停止屏幕同享的按钮。
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 视频播放器。
打开两个浏览器窗口检查是否正常。
该项目的源代码可在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())
}
流媒体运用
接下来从一个将同享其屏幕的运用程序开始,需求代表流媒体连接到服务器。首先,需求创立Engine
和Browser
实例:
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 服务器,但这次是作为接纳器。因而,创立Engine
、Browser
实例,并导航到接纳者的 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 运用程序中同享屏幕并运用 JxBrowser 在另一个运用程序中显现它。 我创立了一个能够同享屏幕的简略 JavaScript 运用程序。然后运用 JxBrowser 将它集成到两个 Swing 运用程序中。借助 JxBrowser 供给的捕获 API,丰富了规范 Java 运用程序的屏幕同享功用。