为什么我的视频没有用 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.
我正在尝试使用 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.