如何使用选择了JFileChooser形式的Canvas播放视频

时间:2014-01-23 08:44:57

标签: java vlcj

我正在尝试将视频播放器嵌入JFrame,如下用户点击JMenu然后点击JMenuItem(打开视频)弹出JFileChooser并要求下摆选择视频并将JTextFile移到右侧,设置视频到左侧我做了所有这些,但我不知道如何将视频放入画布,因为它总是给出错误,所以我需要写入方式,因为我删除了所有的错误行,所以这里的代码不给任何错误我有2个类为gui的第一个类,第二个是我在这里写的可以任何人帮助我在actionlistener和我的附加类中写什么

这是视频操作类

    /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */


package animeaid;


import java.awt.Canvas;
import java.awt.Color;
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 com.sun.jna.Native;
import com.sun.jna.NativeLibrary;

    /**
     *
     * @author isslam
     */

    public class VideoOpration {

        public static Canvas c;

       VideoOpration() {

            MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
            c = new Canvas();
            c.setBackground(Color.black);
            EmbeddedMediaPlayer mediaPlayer = mediaPlayerFactory.newEmbeddedMediaPlayer();
            mediaPlayer.setVideoSurface(mediaPlayerFactory.newVideoSurface(c));
            mediaPlayer.playMedia(GuiInterface.mediaPath);

        }

}

声明JFileChoosear的gui类

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package AnimeAid;

import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.*;
import javax.swing.table.*;
import uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;



/**
 *
 * @author isslam
 */
public class GuiInterface extends JFrame {

    private final JTable table;
    private final JTextField enterText;
    private final JMenu jMenu1,jMenu2,jMenu3;
    private final JMenuBar jMenuBar1;
    private final JMenuItem itemNewSrt,itemOpenVideo;
    private static JFileChooser ourFileSelector;
    File ourFile;
    public static String  mediaPath="";
    String vlcPath="C:\\Program Files\\VideoLAN\\VLC";


    public GuiInterface(String title){

    setSize(1024, 720);
    setTitle(title);
    setDefaultCloseOperation(GuiInterface.EXIT_ON_CLOSE);
    String[] columnNames = {"#","Start","End","Translation column"};
    Object[][] data = {
    {"1", "00:00:01,600","00:00:04,080", "Mr Magnussen, please state your\n" +
    "full name for the record."},
    {"2", "00:00:04,080 ","00:00:07,040","Charles Augustus Magnussen."}};
    enterText = new JTextField();
    ourFileSelector = new JFileChooser();
    jMenuBar1 = new JMenuBar();
    jMenu1 = new JMenu("File");
    jMenu2 = new JMenu("Video");
    jMenu3 = new JMenu("Subtitle");

    jMenuBar1.add(jMenu1);
    jMenuBar1.add(jMenu2);
    jMenuBar1.add(jMenu3);

    itemNewSrt = new JMenuItem("this text only");
    jMenu1.add(itemNewSrt);


    itemOpenVideo = new JMenuItem("Open Video");
    jMenu2.add(itemOpenVideo);

    setJMenuBar(jMenuBar1);
    table = new JTable(data, columnNames);
    table.setFillsViewportHeight(true);
    table.setAutoResizeMode( JTable.AUTO_RESIZE_ALL_COLUMNS );
        TableColumn columnA = table.getColumn("#");
        columnA.setMinWidth(10);
        columnA.setMaxWidth(20);
        TableColumn columnB= table.getColumn("Start");
        columnB.setMinWidth(80);
        columnB.setMaxWidth(90);

        TableColumn columnC= table.getColumn("End");
        columnC.setMinWidth(80);
        columnC.setMaxWidth(90);

        JPanel textFiled = new JPanel(new GridBagLayout());
        GridBagConstraints co = new GridBagConstraints();
        co.fill = GridBagConstraints.HORIZONTAL;
        co.gridx =0;
        co.gridy =0;
        co.weightx=0.5;
        co.weighty=1;
        co.gridheight=0;
        co.gridwidth=0;
        co.ipadx=900;
        co.ipady=80;
        co.anchor = GridBagConstraints.PAGE_START;
        co.insets = new Insets(100, 0, 5, 0);
        textFiled.add(enterText,co);

        JPanel p = new JPanel();
        p.add(VideoOpration.c);

        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane, BorderLayout.CENTER);
        add(textFiled, BorderLayout.NORTH);
        add(p, BorderLayout.WEST);









        //Container cp = getContentPane();
        //cp.add(videoCon);
       itemOpenVideo.addActionListener(new MenuBarMethod());

    }

public class MenuBarMethod implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent a){
        Object buttonPressed=a.getSource();
       if(buttonPressed.equals(itemOpenVideo)){
        ourFileSelector.setFileSelectionMode(JFileChooser.FILES_ONLY);
        ourFileSelector.showSaveDialog(null);
        ourFile = ourFileSelector.getSelectedFile();
        mediaPath = ourFile.getAbsolutePath();
        NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), vlcPath);
        Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);

       }
    }

}

}

1 个答案:

答案 0 :(得分:1)

您的视频表面Canvas正被添加到JPanel。

默认情况下,JPanel具有FlowLayout,FlowLayout根据其首选大小布置组件。您的画布没有首选大小,因此不会显示。在面板上设置更合适的布局管理器,例如使用CENTER约束的BorderLayout,或者使用setSize()为Canvas增加一个大小。

你还有一个问题......

当构造函数退出时,您的MediaPlayerFactory和EmbeddedMediaPlayer引用将超出范围,因此将有资格进行垃圾回收。发生这种情况时,您的视频播放将停止。您必须保持这些对象固定以防止垃圾收集(通常将它们声明为类中的字段将完成此操作,但您必须确保包含这些引用的类也不会超出范围)。

事实上,你的" VideoOpration"对我来说,课程看起来多余,如果没有它,你的代码会更清晰。

最后,你的方法的一个基本问题是你真的不应该在这两个类之间共享静态变量来交换信息。你知道调用方法和传递变量等基础知识吗?对不起?

你真的应该看看[1]中vlcj提供的许多例子,特别是[2]。

[1] https://github.com/caprica/vlcj/tree/master/src/test/java/uk/co/caprica/vlcj/test

[2] https://github.com/caprica/vlcj/blob/master/src/test/java/uk/co/caprica/vlcj/test/basic/TestPlayer.java