java - 从 vlcj 播放器数组中播放视频

标签 java swing vlc libvlc vlcj

我正在尝试播放以字符串形式提供的 MRL 列表中的视频。

问题是当我尝试运行该类时,面板列表显示带有按钮,只有一个面板工作,但播放按钮不起作用,其他面板也不起作用。

虽然我故意留下了停止按钮,因为我没有向它们添加 Action 监听器。

我想要实现的是,当我运行该类时,播放一个视频,当我单击另一个视频的播放按钮时,当前视频停止并移至下一个视频。

我不知道我错在哪里。

这是我的代码:

public class MediaPlayer extends JPanel {

    //Declares our media player component
    private EmbeddedMediaPlayerComponent[] mediaplayer;
    private String[] mediapath = {""};
    private final String vlcpath = "C:\\Program Files (x86)\\VideoLAN\\VLC";
    private JPanel video_pnl, control_pnl;
    private JButton[] play_btn, stop_btn;
    private int but = 0;

    public MediaPlayer(String mediapath[]) {
        this.mediapath = mediapath;

        play_btn = new JButton[1];
        stop_btn = new JButton[1];
        mediaplayer = new EmbeddedMediaPlayerComponent[1];
        int increment = 0;
        while (increment < mediapath.length) {
            video_pnl = new JPanel();
            video_pnl.setLayout(new BorderLayout());
            control_pnl = new JPanel();
            control_pnl.setLayout(new FlowLayout(FlowLayout.CENTER));
            for (int i = 0; i < 1; i++) {

                NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), vlcpath);
                mediaplayer[i] = new EmbeddedMediaPlayerComponent();
                play_btn[i] = new JButton("play");
                stop_btn[i] = new JButton("stop");


                video_pnl.add(mediaplayer[i], BorderLayout.CENTER);

                control_pnl.add(play_btn[i]);
                control_pnl.add(stop_btn[i]);
                video_pnl.add(control_pnl, BorderLayout.SOUTH);

                Handler handler = new Handler();
                play_btn[i].addActionListener(handler);
            }
            add(video_pnl);
            increment++;
        }
    }

    private class Handler implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == play_btn){
                play();
            }
        }
    }

    public void play() {
        for (int i = 0; i < mediapath.length; i++) {
            mediaplayer[i].getMediaPlayer().playMedia(mediapath[i]);
        }
    }

    public static void main(String[] args) {
        //Declare and initialize local variables
        String[] mediaPath =       {"C:\\\\Users\\\\goldAnthony\\\\Desktop\\\\Videos\\\\Whistle.mp4", "C:\\\\Users\\\\goldAnthony\\\\Desktop\\\\Videos\\\\Beyonce_Hello.mp4",
        "C:\\Users\\goldAnthony\\Desktop\\Videos\\HansRosling_2012S_480p.mp4","C:\\Users\\goldAnthony\\Desktop\\Videos\\oow2010_2.mp4",
        "C:\\Users\\goldAnthony\\Desktop\\Videos\\The_Economic_Environment.mp4"};

        //creates instances of the VlcPlayer object, pass the mediaPath and invokes the method "run"
        MediaPlayer mediaplayer = new MediaPlayer(mediaPath);
        JFrame ourframe = new JFrame();
        ourframe.setContentPane(mediaplayer);
        ourframe.setLayout(new GridLayout(5, 1));
        ourframe.setSize(300, 560);
        ourframe.setVisible(true);
        mediaplayer.play();
        ourframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
                control_pnl.add(play_btn[i]);
                control_pnl.add(stop_btn[i]);
                video_pnl.add(control_pnl, BorderLayout.SOUTH);

                Handler handler = new Handler();
                play_btn[i].addActionListener(handler);
            }
            add(video_pnl);
            increment++;
        }
    }

    private class Handler implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == play_btn){
                play();
            }
        }
    }

    public void play() {
        for (int i = 0; i < mediapath.length; i++) {
            mediaplayer[i].getMediaPlayer().playMedia(mediapath[i]);
        }
    }

    public static void main(String[] args) {
        //Declare and initialize local variables
        String[] mediaPath =       {"C:\\\\Users\\\\goldAnthony\\\\Desktop\\\\Videos\\\\Whistle.mp4", "C:\\\\Users\\\\goldAnthony\\\\Desktop\\\\Videos\\\\Beyonce_Hello.mp4",
        "C:\\Users\\goldAnthony\\Desktop\\Videos\\HansRosling_2012S_480p.mp4","C:\\Users\\goldAnthony\\Desktop\\Videos\\oow2010_2.mp4",
        "C:\\Users\\goldAnthony\\Desktop\\Videos\\The_Economic_Environment.mp4"};

        //creates instances of the VlcPlayer object, pass the mediaPath and invokes the method "run"
        MediaPlayer mediaplayer = new MediaPlayer(mediaPath);
        JFrame ourframe = new JFrame();
        ourframe.setContentPane(mediaplayer);
        ourframe.setLayout(new GridLayout(5, 1));
        ourframe.setSize(300, 560);
        ourframe.setVisible(true);
        mediaplayer.play();
        ourframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

最佳答案

JPanel video_pnlBorderLayout.CENTER 只能容纳一个组件。构造函数循环结束后,它会引用最后添加的 mediaplayer[i]。在您的监听器中,您可以使用 CardLayout更改面板或更新单个面板。

关于java - 从 vlcj 播放器数组中播放视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20760900/

相关文章:

android - 使用 LibVLC 在 Android 上进行视频旋转

java - 无法使用 scim2 创建askPassword 用户

java - 从 String 中检索值的最快方法是什么?

java - JFrame 将位置设置在 MAC OSX 窗口的中心

java - JPanel自定义背景

javascript - 从网络浏览器打开 VLC 网络流媒体

java 8 可选列表收集列表编译错误

java - 保持条目按添加顺序的映射实现

java - 确定悬停在哪个形状上 - Java

java - 无法显示来自 vlcj 的流视频