为什么我的视频没有用 VLCJ 显示,但我有视频的声音

Why my video is not being displayed with VLCJ but I have the sound of the video

我正在尝试使用 VLCJ 和 Swing 创建一个 MediaPlayer,因为使用 JavaFX 我无法读取 .avi 媒体。我已经按照 TutorialPoint 上的教程进行操作,但是视频没有显示,我可以听到声音。

这是代码

import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent;

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

public class App extends JFrame {

    private static final long serialVersionUID = 1L;
    private static final String TITLE = "My First Media Player";
    private static final String VIDEO_PATH = "/Users/jul/Desktop/Harry Potter (2) et la chambre des secrets.avi";
    private final EmbeddedMediaPlayerComponent mediaPlayerComponent;
    private JButton playButton;
    private JButton pauseButton;

    public App(String title) {
        super(title);
        mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
    }

    public void initialize() {
        this.setBounds(100, 100, 600, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                mediaPlayerComponent.release();
                System.exit(0);
            }
        });
        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(mediaPlayerComponent, BorderLayout.CENTER);
        JPanel controlsPane = new JPanel();
        playButton = new JButton("Play");
        controlsPane.add(playButton);
        pauseButton = new JButton("Pause");
        controlsPane.add(pauseButton);
        contentPane.add(controlsPane, BorderLayout.SOUTH);
        playButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mediaPlayerComponent.mediaPlayer().controls().play();
            }
        });
        pauseButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mediaPlayerComponent.mediaPlayer().controls().pause();
            }
        });
        this.setContentPane(contentPane);
        this.setVisible(true);
    }

    public void loadVideo(String path) {
        mediaPlayerComponent.mediaPlayer().media().startPaused(path);
    }

    public static void main( String[] args ){
        try {
            UIManager.setLookAndFeel(
                    UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception e) {
            System.out.println(e);
        }
        App application = new App(TITLE);
        application.initialize();
        application.setVisible(true);
        application.loadVideo(VIDEO_PATH);
    }
}

你可以看到我有 window 按钮,当我按下播放和暂停按钮时它可以工作,但视频不显示。我只是黑屏,有声音。

此处视频失败,因为您在 macOS 上使用 EmbeddedMediaPlayerComponent

EmbeddedMediaPlayerComponent 和扩展 LibVLC,需要像 AWT Canvas 这样的重量级组件来渲染视频。 Java 在 macOS 上不再有任何重量级的 AWT,所以它不会工作。

事实上,令我惊讶的是,当您 运行 您的应用程序时,至少没有出现一条错误消息。

此处最简单的解决方案是将 EmbeddedMediaPlayerComponent 替换为 CallbackMediaPlayerComponent。那是文字 one-line 代码更改。不同之处在于回调组件将视频的每一帧渲染(或在此上下文中“绘制”)到您想要的任何组件中。

这可行,但以这种方式渲染视频会花费更多 CPU。

我认为有更好的替代方法。其中一种替代方法是将 vlcj 与 JavaFX 一起使用,请参见此处的示例:https://github.com/caprica/vlcj-javafx-demo.