Java 原生媒體播放能力有限,VLCJ 作為 LibVLC 的 Java 封裝,提供了強大的跨平台視頻播放能力。本文記錄從零搭建 Java 視頻播放器的完整流程。
C:\Program Files\VideoLAN\VLC)<dependency>
<groupId>uk.co.caprica</groupId>
<artifactId>vlcj</artifactId>
<version>4.7.1</version> <!-- 或最新版 -->
</dependency>
vlcj-4.7.1.jar、jna-5.x.jar、jna-platform-5.x.jar<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId> <!-- 無操作實現,避免日志噪音 -->
<version>1.7.30</version>
</dependency>
從 VLC 安裝目錄複製以下文件到項目資源目錄(如 src/main/resources/native):
libvlc.dlllibvlccore.dllplugins 文件夾(整個目錄)project-root
├── src/main/java
│ └── com/example/player/VideoPlayer.java
├── src/main/resources
│ └── native
│ ├── libvlc.dll
│ ├── libvlccore.dll
│ └── plugins/...
import uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;
import uk.co.caprica.vlcj.runtime.windows.WindowsRuntimeUtil;
import javax.swing.*;
import java.awt.*;
public class VideoPlayer {
public static void main(String[] args) {
// 1. 設置原生庫搜索路徑(關鍵步驟)
System.setProperty("jna.library.path", "src/main/resources/native");
// 或使用 RuntimeUtil 設置
RuntimeUtil.setLibVlcLibraryPath("src/main/resources/native");
// 2. 創建媒體播放器工廠
MediaPlayerFactory factory = new MediaPlayerFactory();
// 3. 創建嵌入式播放器
EmbeddedMediaPlayer mediaPlayer = factory.mediaPlayers().newEmbeddedMediaPlayer();
// 4. 創建 Swing 界面
JFrame frame = new JFrame("VLCJ Player");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
// 視頻顯示面板
Canvas videoSurface = new Canvas();
videoSurface.setBackground(Color.BLACK);
frame.add(videoSurface, BorderLayout.CENTER);
// 控制面板(簡易)
JPanel controlPanel = new JPanel();
JButton btnPlay = new JButton("播放");
JButton btnPause = new JButton("暫停");
JButton btnStop = new JButton("停止");
controlPanel.add(btnPlay);
controlPanel.add(btnPause);
controlPanel.add(btnStop);
frame.add(controlPanel, BorderLayout.SOUTH);
// 5. 綁定視頻輸出面板
mediaPlayer.videoSurface().set(videoSurface);
// 6. 事件綁定
btnPlay.addActionListener(e -> mediaPlayer.media().play("file:///D:/test.mp4"));
btnPause.addActionListener(e -> mediaPlayer.controls().pause());
btnStop.addActionListener(e -> mediaPlayer.controls().stop());
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
| 配置項 | 說明 |
|---|---|
jna.library.path | 指定 JNA 查找 libvlc.dll 的路徑,必須指向包含 dll 和 plugins 的目錄 |
MediaPlayerFactory | 核心工廠,管理 LibVLC 實例生命週期 |
EmbeddedMediaPlayer | 嵌入式播放器,可嵌入 Swing/AWT/JavaFX 組件 |
videoSurface().set() | 將視頻幀渲染到指定 Canvas/JPanel |
jna.library.path 和 dll 是否存在plugins 目錄vlcj.lib.path 指向 libvlc.so/libvlc.dylibmediaPlayer.media().prepare() 預加載mediaPlayer.subPicture().setSubPictureFile()mediaPlayer.saveSnapshot()JavaFXVideoSurface 替代 CanvasVLCJ + LibVLC 是 Java 平台上功能最全、兼容性最好的視頻播放方案,掌握它能為應用快速添加專業級媒體播放能力。