You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何在JavaSwing中用vlcj实现视频背景播放?当前黑屏

解决vlcj在Swing中播放视频黑屏的问题

1. 修复媒体文件路径问题

项目资源目录下的文件无法通过直接相对路径"videos/WeatheringWithYou.mp4"访问,需通过类加载器获取正确的运行时路径,同时处理路径中的特殊字符:

public void play(){
    if(mediaPlayer.status().isPlaying()){
        mediaPlayer.controls().stop();
    }
    try {
        String videoPath = getClass().getResource("/videos/WeatheringWithYou.mp4").getPath();
        videoPath = java.net.URLDecoder.decode(videoPath, "UTF-8");
        mediaPlayer.media().play(videoPath);
        mediaPlayer.controls().play();
    } catch (Exception e) {
        e.printStackTrace();
        JOptionPane.showMessageDialog(this, "视频加载失败:" + e.getMessage());
    }
}

2. 调整窗口事件触发逻辑

原windowActivated事件会在窗口每次获得焦点时重复触发播放,导致播放中断。改为windowOpened确保仅在窗口首次打开时播放一次,同时将资源释放逻辑移至windowClosing(窗口关闭前执行,避免组件已销毁时操作):

在Main类的init方法中修改WindowAdapter:

addWindowListener(new WindowAdapter() {
    @Override
    public void windowOpened(WindowEvent e) {
        home.play();
    }

    @Override
    public void windowClosing(WindowEvent e) {
        home.stop();
    }
});

3. 优化视频渲染与资源释放

  • 开启视频缩放,让画面自适应Canvas大小
  • 设置Canvas透明背景,避免初始黑屏
  • 增加非空判断,确保资源释放安全

修改Home类的init和stop方法:

private void init(){
    factory = new MediaPlayerFactory();
    mediaPlayer = factory.mediaPlayers().newEmbeddedMediaPlayer();
    // 开启视频缩放适配
    mediaPlayer.videoScaled().set(true);
    
    Canvas canvas = new Canvas();
    canvas.setBackground(new Color(0, 0, 0, 0)); // 透明背景
    mediaPlayer.videoSurface().set(factory.videoSurfaces().newVideoSurface(canvas));

    setLayout(new BorderLayout());
    add(canvas);
}

public void stop(){
    if(mediaPlayer != null){
        mediaPlayer.controls().stop();
        mediaPlayer.release();
    }
    if(factory != null){
        factory.release();
    }
}

完整修改后的代码

Home.java

package org.forms;

import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;

import java.awt.*;
import javax.swing.*;

public class Home extends JPanel {
    private MediaPlayerFactory factory;
    private EmbeddedMediaPlayer mediaPlayer;
    public Home() {
        init();
    }

    private void init(){
        factory = new MediaPlayerFactory();
        mediaPlayer = factory.mediaPlayers().newEmbeddedMediaPlayer();
        mediaPlayer.videoScaled().set(true);
        
        Canvas canvas = new Canvas();
        canvas.setBackground(new Color(0, 0, 0, 0));
        mediaPlayer.videoSurface().set(factory.videoSurfaces().newVideoSurface(canvas));

        setLayout(new BorderLayout());
        add(canvas);
    }

    public void play(){
        if(mediaPlayer.status().isPlaying()){
            mediaPlayer.controls().stop();
        }
        try {
            String videoPath = getClass().getResource("/videos/WeatheringWithYou.mp4").getPath();
            videoPath = java.net.URLDecoder.decode(videoPath, "UTF-8");
            mediaPlayer.media().play(videoPath);
            mediaPlayer.controls().play();
        } catch (Exception e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(this, "视频加载失败:" + e.getMessage());
        }
    }

    public void stop(){
        if(mediaPlayer != null){
            mediaPlayer.controls().stop();
            mediaPlayer.release();
        }
        if(factory != null){
            factory.release();
        }
    }
}

Main.java

package org.main;

import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont;
import com.formdev.flatlaf.themes.FlatMacDarkLaf;
import com.formdev.flatlaf.util.UIScale;
import org.forms.Home;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Main extends JFrame {
    private Home home;
    public Main() {
        init();
    }

    private void init(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setUndecorated(false);
        setSize(UIScale.scale(new Dimension(1365, 768)));
        setLocationRelativeTo(null);
        home = new Home();
        setContentPane(home);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent e) {
                home.play();
            }

            @Override
            public void windowClosing(WindowEvent e) {
                home.stop();
            }
        });
    }

    public static void main(String[] args) {
        FlatRobotoFont.install();
        FlatMacDarkLaf.setup();
        UIManager.put("defaultFont", new Font(FlatRobotoFont.FAMILY, Font.PLAIN, 13));
        EventQueue.invokeLater(() -> new Main().setVisible(true));
    }
}

额外检查项

  • 确认videos/WeatheringWithYou.mp4已放置在项目src/main/resources目录(Maven/Gradle结构)或普通项目的资源目录,编译后可在classpath中找到
  • 确保VLC版本与vlcj依赖版本兼容,优先使用最新稳定版
  • 运行时查看控制台异常输出,若有文件找不到提示,优先排查路径配置

内容的提问来源于stack exchange,提问作者N R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 22:35:10