Captura do tcr de vídeo usando JMF

0 respostas
Geovane_Jair

Pessoal, estou construindo uma aplicação para uso pessoal que consiste em um player de vídeo usando o framework JMF. A aplicação já está funcionando, naturalmente ainda tem bastante coisa pra melhorar. Meu objetivo é criar uma aplicação para marcação de legendas para filmes. Por isso é de suma importância que eu consiga exibir o tempo do vídeo e capturá-lo prontamente para gravar em um arquivo de texto.

Alguém poderia me ajudar como posso obter o tcr do vídeo exibido. Segue abaixo código da classe principal:

package videoplayer;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.media.ControllerErrorEvent;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.Manager;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.RealizeCompleteEvent;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.filechooser.FileNameExtensionFilter;

public class MediaPlayerFrame extends javax.swing.JFrame {
	
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButton5;
    private javax.swing.JDesktopPane jDesktopPane1;
    private javax.swing.JFileChooser jFileChooser1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JMenuItem jMenuItem5;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JToolBar jToolBar1;
    // End of variables declaration
//Outras variáveis
    public String caminhoarquivo = null;
    private Player player = null;
    private FileNameExtensionFilter mv4, gp,  wmv, mov, mp3, mp4, au, aiff, aif, wav, todosArquivosVideos, todosArquivosAudio;


/////////////interface gráfica//////////////////////
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jFileChooser1 = new javax.swing.JFileChooser();
        jToolBar1 = new javax.swing.JToolBar();
        jButton1 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        jPanel2 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jDesktopPane1 = new javax.swing.JDesktopPane();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        jMenuItem4 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem5 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("     *VanPlayer*");

        jToolBar1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jToolBar1.setRollover(true);

        jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/folder.png"))); // NOI18N
        jButton1.setText("Abrir");
        jButton1.setFocusable(false);
        jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton1);

        jButton4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/information.png"))); // NOI18N
        jButton4.setText("Sobre");
        jButton4.setFocusable(false);
        jButton4.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton4ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton4);

        jButton5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/cancel.png"))); // NOI18N
        jButton5.setText("Fechar");
        jButton5.setFocusable(false);
        jButton5.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton5);
        jToolBar1.add(jSeparator2);

        jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jLabel1.setFont(new java.awt.Font("Tahoma", 0, 10));
        jLabel1.setText("Parado");

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 431, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 14, Short.MAX_VALUE)
                .addContainerGap())
        );

        jDesktopPane1.setLayout(new BorderLayout());
        jDesktopPane1.setBackground(Color.black);

        jMenu1.setText("Arquivo");
        jMenu1.setFocusPainted(true);
        /*
        jMenu1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenu1ActionPerformed(evt);
            }
        });
        */

        jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0));
        jMenuItem1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/folder.png"))); // NOI18N
        jMenuItem1.setText("Abrir");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem1);
        jMenu1.add(jSeparator1);

        jMenuItem4.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F12, 0));
        jMenuItem4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/cancel.png"))); // NOI18N
        jMenuItem4.setText("Sair");
        jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem4ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem4);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Ajuda");

        jMenuItem5.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F11, 0));
        jMenuItem5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/information.png"))); // NOI18N
        jMenuItem5.setText("Sobre");
        jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem5ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItem5);

        jMenuBar1.add(jMenu2);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jToolBar1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 455, Short.MAX_VALUE)
            .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jDesktopPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 455, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jDesktopPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 393, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>


   
/////////////Construtor do Player///////////////////
    public MediaPlayerFrame1() throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
        initComponents();
        setLocationRelativeTo(null);
     }

    // abre a janela de diálogo para escolha de arquivos
    private void AbrirArquivo() throws IOException, NoPlayerException{
        File arquivo = null; 
        jFileChooser1.setMultiSelectionEnabled(false);
        AdicionarFiltrosArquivos();
        int resultado = jFileChooser1.showOpenDialog(this);
                  if(resultado == JFileChooser.APPROVE_OPTION){
                        arquivo = jFileChooser1.getSelectedFile();
                        caminhoarquivo = jFileChooser1.getSelectedFile().getAbsolutePath();
                        PrepararVideo(arquivo);
                        RemoverFiltrosArquivos();
                  }else{
                        arquivo = null;
                        RemoverFiltrosArquivos();
                  }
 }

    //Cria o gerenciador do player e prepara o arquivo
    private void PrepararVideo(File file) throws IOException, NoPlayerException{
        FecharPlayer();
        try{
            player = Manager.createPlayer(file.toURI().toURL());
            if (player != null){
                player.addControllerListener((ControllerListener) new EventHandler());
                player.prefetch();
                player.start();
            }
        }catch (Exception e){
          JOptionPane.showMessageDialog(null, "Formato não suportado");
        }
    }

    private void FecharPlayer() {
        if(player == null){
           jLabel1.setText("Parado");
           return;
        }else{
            player.stop();
            player.close();
            Component visual = player.getVisualComponent();
            if(visual != null){
                jDesktopPane1.remove(visual);
                              
            }
            if (player.getControlPanelComponent() != null){
                    jDesktopPane1.remove(player.getControlPanelComponent());

           }
           jDesktopPane1.removeAll();
 
        }
    }

    public void AdicionarFiltrosArquivos(){

        wmv = new FileNameExtensionFilter("Windows Media Video (*.wmv)", "wmv");
        mov = new FileNameExtensionFilter("QuickTime movie (*.mov)", "mov");
        wav = new FileNameExtensionFilter("WAVEform audio format (*.wav)", "wav");
        mp3 = new FileNameExtensionFilter("MPEG-1/2 Audio Layer 3 (*.mp3)", "mp3");
        aiff = new FileNameExtensionFilter("Audio Interchange File Format(*.aiff)", "aiff");
        au = new FileNameExtensionFilter("Unix Audio(*.au)", "au");
        mp4 = new FileNameExtensionFilter("MPEG-4 Part 14(*.mp4)", "mp4");
        gp = new FileNameExtensionFilter("3GPP file format(*.3gp, *.3g2)", "3gp", "3g2");
        mv4 = new FileNameExtensionFilter("QuickTime movie (*.m4v)", "m4v");
        todosArquivosAudio = new FileNameExtensionFilter("Arquivos Áudio (*.wav, *.mp3, *.aiff, *.aif, *.au)", "wav", "mp3", "aif", "aiff", "au");
        todosArquivosVideos = new FileNameExtensionFilter("Arquivos Vídeos (*.mov, *.avi, *.mpeg, *.mp4, *.wmv, *.3gp, *.3g2, *.m4v)", "mov", "avi", "mpeg", "wmv", "mp4", "m4v", "3gp", "3g2");

        jFileChooser1.addChoosableFileFilter(mov);
        jFileChooser1.addChoosableFileFilter(wmv);
        jFileChooser1.addChoosableFileFilter(mp4);
        jFileChooser1.addChoosableFileFilter(mv4);
        jFileChooser1.addChoosableFileFilter(gp);

        jFileChooser1.addChoosableFileFilter(mp3);
        jFileChooser1.addChoosableFileFilter(wav);
        jFileChooser1.addChoosableFileFilter(aiff);
        jFileChooser1.addChoosableFileFilter(au);

        jFileChooser1.addChoosableFileFilter(todosArquivosAudio);
        jFileChooser1.addChoosableFileFilter(todosArquivosVideos);

    }

    public void RemoverFiltrosArquivos(){
        jFileChooser1.removeChoosableFileFilter(mov);
        jFileChooser1.removeChoosableFileFilter(wmv);
        jFileChooser1.removeChoosableFileFilter(mp4);
        jFileChooser1.removeChoosableFileFilter(mv4);
        jFileChooser1.removeChoosableFileFilter(gp);

        jFileChooser1.removeChoosableFileFilter(wav);
        jFileChooser1.removeChoosableFileFilter(mp3);
        jFileChooser1.removeChoosableFileFilter(aiff);
        jFileChooser1.removeChoosableFileFilter(au);

        jFileChooser1.removeChoosableFileFilter(todosArquivosAudio);
        jFileChooser1.removeChoosableFileFilter(todosArquivosVideos);
    }

//////////////Eventos e chamadas da interface gráfica ///////////////////////

  
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
            AbrirArquivo();
        } catch (IOException ex) {
            Logger.getLogger(MediaPlayerFrame1.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoPlayerException ex) {
            Logger.getLogger(MediaPlayerFrame1.class.getName()).log(Level.SEVERE, null, ex);
        }
    }                                        

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try {
            AbrirArquivo();
        } catch (IOException ex) {
            Logger.getLogger(MediaPlayerFrame1.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoPlayerException ex) {
            Logger.getLogger(MediaPlayerFrame1.class.getName()).log(Level.SEVERE, null, ex);
        }
    }                                          

    private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {                                           
         FecharPrograma();
    }                                          

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        FecharPrograma();
    }                                        

    private void jMenu1ActionPerformed(java.awt.event.ActionEvent evt) {                                       
        
    }                                      

    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
       ChamarFrmSobre();
    }                                        

    private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        ChamarFrmSobre();
    }                                          

   
    private void FecharPrograma(){
        FecharPlayer();
        System.exit(0);
    }

    private void ChamarFrmSobre(){
        FrmSobre telasobre = new FrmSobre(this, true);
        telasobre.setVisible(true);
    }


private	class EventHandler implements	ControllerListener{
        @Override
		public void controllerUpdate(ControllerEvent EventoReproducao)	{
                  	if(EventoReproducao instanceof RealizeCompleteEvent){
				Component visualComponent = player.getVisualComponent();
				if(visualComponent != null){
                                    jDesktopPane1.add(visualComponent, BorderLayout.CENTER);
				}

                                Component controles = player.getControlPanelComponent();
                                                               
                                if(controles != null){
                                    jDesktopPane1.add(controles, BorderLayout.SOUTH);
                                    
                                }
                                jDesktopPane1.doLayout();
                               
                        }

                        if(EventoReproducao instanceof ControllerErrorEvent){
                            if(player == null){
                                jLabel1.setText("Parado");
                            }else{
                                jLabel1.setText("Erro na reprodução do arquivo: "+caminhoarquivo);
                                try{
                                    player.close();
                                    Component visual = player.getVisualComponent();
                                    if(visual != null){
                                        jDesktopPane1.remove(visual);
                                    }
                                    if (player.getControlPanelComponent() != null){
                                        jDesktopPane1.remove(player.getControlPanelComponent());
                                    }
                                    jDesktopPane1.removeAll();
                                }catch (Exception ex){
                                    //
                                }
                            }

                        }

            }
    }


}
Criado 13 de julho de 2012
Respostas 0
Participantes 1