天天看點

Java中的螢幕共享

了解如何使用 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())
}
複制代碼      

流媒體應用

接下來從一個将共享其螢幕的應用程式開始,需要代表流媒體連接配接到伺服器。首先,需要建立​

​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 應用程式中顯示流媒體螢幕,建立 Swing​

​BrowserView​

​元件并将其嵌入到​

​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);
}
複制代碼      

該元件将使用HTML5​

​BrowserView​

​視訊播放器顯示加載網頁的内容,我們将能夠看到流媒體的螢幕。

結論