Java 中的屏幕共享

发布于:2023-01-16 ⋅ 阅读:(322) ⋅ 点赞:(0)

远程屏幕共享用于各种应用程序和服务,从 Web 会议到远程访问应用程序。后台员工可以使用它来咨询一线的同事,或者技术支持专家可以使用它来准确了解客户看到的内容。

您可以使用第三方应用程序,例如TeamViewer。但是,如果您需要在 Java 应用程序中直接具有远程访问功能,该怎么办?在这种情况下,您可能希望转到另一个方向。

在本文中,我将展示一种方法,该方法允许您使用JxBrowser的功能在不同PC上运行的两个Java应用程序之间实现屏幕共享。

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

为了在Java中实现屏幕共享,我将利用Chromium支持开箱即用的屏幕共享,而JxBrowser提供了对它的编程访问。

概述

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

该服务器是WebRTС服务器的简单实现。项目的这一部分包含用于连接到服务器和启动屏幕共享会话的 JavaScript 代码。

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

WebRTC Server

WebRTC服务器配置为两个客户端之间的交互:一个流送器和一个接收器。它分别提供两个静态页面。streamer.htmlreceiver.html

const app = express();brbrapp.use(express.static('public'));brbrapp.get('/streamer', (req, res) => {br   res.sendFile(rootPath + 'public/streamer.html');br});brbrapp.get('/receiver', (req, res) => {br   res.sendFile(rootPath + 'public/receiver.html');br});

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

要检查一切是否正常工作,让我们打开两个浏览器窗口并亲自查看。

该项目的源代码可在 GitHub 上找到。

Java 客户端

让我们实现 Java 客户端,并将它们与 JavaScript 应用程序集成。我们需要初始化一个空的 Gradle 项目,并使用 JxBrowser Gradle 插件添加 JxBrowser 依赖项。

plugins {br   …br   id("com.teamdev.jxbrowser.gradle") version "0.0.3"br}brbrjxbrowser {br   version = "7.24"br}brbrdependencies {br   // Detects the current platform and adds the corresponding Chromium binaries. br   implementation(jxbrowser.currentPlatform())brbr   // Adds a dependency to Swing integration.br   implementation(jxbrowser.swing())br}

主播应用

让我们从将共享其屏幕的应用程序开始。

我们需要代表主播连接到服务器。首先,我们需要创建和实例:EngineBrowser

Engine engine = Engine.newInstance(HARDWARE_ACCELERATED);brBrowser browser = engine.newBrowser();

并加载所需的网址:

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

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

JButton startSharingButton = new JButton("Share your screen");brbrstartSharingButton.addActionListener(e -> {br   browser.mainFrame().ifPresent(mainFrame ->    br       mainFrame.executeJavaScript("startScreenSharing()"));br});

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

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

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

private CaptureSession captureSession;br…brbrowser.on(CaptureSessionStarted.class, event -> br    captureSession = event.capture()br);br

为此,我们需要一个不同的按钮:

JButton stopSharingButton = new JButton("Stop sharing");brstopSharingButton.addActionListener(e -> {br   captureSession.stop();br});

接收器应用程序

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

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

Engine engine = Engine.newInstance(HARDWARE_ACCELERATED);brBrowser browser = engine.newBrowser();brbrowser.navigation().loadUrlAndWait("http://localhost:3000/receiver");

要在 Java 应用中显示主播的屏幕,让我们创建 Swing 组件并将其嵌入到 :BrowserViewJFrame

private static void initUI(Browser browser) {br   BrowserView view = BrowserView.newInstance(browser);brbr   JFrame frame = new JFrame("Receiver");br   frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);br   frame.setSize(700, 500);br   frame.add(view, BorderLayout.CENTER);br   frame.setLocationRelativeTo(null);br   frame.setVisible(true);br}

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

就是这样!

代码示例在 Apache 许可证 2.0 下提供,可在 GitHub 上找到。您可以通过在不同的终端中运行以下命令来启动WebRTC服务器和两个Java应用程序:

cd server && node server.jsbrcd clients && ./gradlew runStreamerbrcd clients && ./gradlew runReceiver

结论

在本文中,我向您展示了如何使用 JxBrowser 在一个 Java 应用程序中共享屏幕,并在另一个应用程序中显示它。

我创建了一个可以共享屏幕的简单JavaScript应用程序。然后,我使用JxBrowser将其集成到两个Swing应用程序中。

使用JxBrowser提供的捕获API,我立即丰富了具有屏幕共享功能的标准Java应用程序。