Como criar um reprodutor de video em java, tentei de varias formas mas nao consigo, ultima coisa q falta para acabar o projeto

88 respostas Resolvido
java
J

Nao consigo criar um reprodutor de video em java

88 Respostas

S

Anos atrás eu utilizei JMF para fazer isso…

J

Em JavaFX usa o MediaPlayer e caso seu projeto esteja em Swing e queira usar o JavaFX pode embuti-lo.

J

Eu criei usando ele mas ele esta dando conflito com audioClip que fala as senhas e setor

J

Como que faço para embutir??

J
Solucao aceita
J

Mas depois de embutido como eu vou criar o media player?

S

Como o @j-menezes disse, usando a classe MediaPlayer.

J

Mas tem como vcs me ajudarem por favor? Nao estou conseguindo criar

J

Eu criei uma classe extends application e joguei todo o código para executar o player javaFX , ele executa mas nao consigo jogar dentro da minha outra classe q é a tela que ele tem que ficar dentro junto com os outros componentes

J

Caso ainda não tenha conseguido resolver fiz um exemplo, veja se lhe é útil.

https://fjle.net/en/o7gOqriyp4guC07/file

Mas a ideia é bem simples, a exemplo do programa dentro do zip
SwingJavaFx_Main_Streaming.java

private static void initFX(JFXPanel fxPanel)   { 
      PlayIntegration play = new PlayIntegration();      // <-- Aqui JavaFX normal
      Scene scene = new Scene(play.createContent());  // <--- Aqui JavaFX normal
      fxPanel.setScene(scene); // <--- Pronto foi para dentro do Swing
}

E em termos de fazer as bibliotecas conversarem um com o outro, isso não é problema porque é tudo Java.

Bons Codigos !

J

Entao, muito obrigado mas eu ja consegui, porém na IDE eclipse ele executa tudo de boa e tal mas ele da um erro quando transforma em .jar no cmd

J

J

Pode ser a versão do Java.
Tenha certeza que esteja usando a versão correta do Java tanto na IDE quanto no prompt.
Por versão correta quero dizer se esta em Java 8 ou superior e modularizado, que no caso precisa chamar os módulos, no Java 8 o JavaFX esta embutido e superiores separado.

J

Então amigo, eu já vi vários tutoriais e tal mas eu não consigo arrumar esse negócio de arguments e tal não entendo muito bem se tiver como me explicar mais detalhado agradeço!

J

Não entendi, como assim arguments?
Mas me diga, qual a versão do Java que estas usando ?

J

Na configuração do Run, java 18 tenho a versão original, e a versão full

J

Versão do Java
Dentro da IDE?
No Prompt?

J

Dentro da ide eu digo, no cmd como eu escolho o java ?

J

Se puder responder minhas perguntas talvez possamos continuar.
Para ver a versão do Java no prompt
java -version

E dentro da IDE, no seu caso eclipse, veja em qual versão o projeto esta compilado

J

Esta na mesma versao eclipse e cmd

J

pode por um print aqui?

J

Posso sim

J

J

J

É que no Jar não contem os módulos do JavaFX.
Qual a versão do JavaFX você usou?
Voce usou Ant, Gradle ou Maven?
Seu projeto foi feito modularizado?

J

Javafx sdk 18.0.2

J

Não usei não

J

Preciso de mais detalhes, todavia se esta usando JavaFX dentro do Swing, são necessários os modulos na chamada.
Sendo assim poderas criar um arquivo de lote ou ainda gerar um executável atraves do jpackager.

J

Pode perguntar! Como assim módulos na chamada?

J

O java > 8 esta modularizado.

Digamos que voce queira usar com
java -jar SeuProjeto.jar

com o Java 8 irá de primeira, porque o JavaFX está dentro do JRE e não é modularizado.

De uma pesquisada sobre o assunto em relação ao Java >= 9 modularização.

J

Muito obrigado parceiro, eu coloquei o java 8 no projeto e no cmd e funcionou tmj brigadao, outra hora dou uma olhada nesse negócio do java 9 pra cima vlw

J

Você me ajudou um tempo atrás, e vi que tem um bom conhecimento do assunto… eu criei o javafx dentro do jfx panel com o mediaplayer porém quando acaba um video é para olhar se tem outro se tiver ele reproduz se não tiver ele reproduz o video principal da clinica novamente porém depois de varias reproduções ele trava e fica só o painel em branco, sabe oque pode ser?

J

Eu precisava de algo tipo: parar o video que acabou e colocar o próximo sem depois de varias reproduções ele ficar em branco e travar

J

Então, é preciso ver o codigo.
Falar assim é complicado, mas dá pra fazer sim.
Em relação a travar essa é uma noticia horrível devido a estabilidade esperada do Java.

Tenho um reprodutorzinho aqui em JavaFX que fica avançando video em video automaticamente ou pode ficar parado em apenas um.

A um tempo atrás quando a Oracle estava menos fechada, sem exigir ter que assinar um documento para estar em contato direto com os desenvolvedores do JavaFX,
Eu tinha um bom contato com a equipe e todas as sugestões e bugs a gente falava diretamente com eles e era bem legal e pratico.

Se tiver algum bug é preciso notificar a equipe através da Oracle.

Tanto JavaFX e Swing funcionam um dentro do outro se for necessário.

Mas minha recomendação é desenvolver tudo em JavaFX.

É mais moderno, mais rápido e isso pode ser constatado por você e olha não tenho criticas ao Swing mesmo porque desenvolvi muitos mas muitos mesmos JavaBeans e plugins com Ele.

Então não tenho bronca do Swing, mas JavaFX esta a frente dele e tambem o Swing chegou num ponto de maturidade que não tem mais correções e nem inovações como é o caso do JavaFX que roda em dispositivos com Epaper por exemplo.

J

Como posso estar te enviando o código?

J

Posso ver seu codigo num horario de folga. Mas como já mencionei isso não é manutenção de sistemas. Caso vá me enviar manda somente a parte que interessa. Pode ser na mensagem privada zipada de preferência.

J

Quando der me avisa por favor, mas entao acha que posso fazer de outra forma? Tipo com outra biblioteca ou algo do tipo

J

Sim em JavaFX, é melhor que Swing e melhor que SWT.

J

Mas a aplicação esta praticamente pronta só falta essa parte, da para trocar para javafx sem muitos problemas?

J

Nesse caso é melhor voce resolver o problema estando em Swing e depois ver se compensa migrar para JavaFX se for o caso.

J

Sera que se enquadra em slgum erro do MediaView ou do MediaPlayer?

J

Precisa ver o que esta provocando o travamento.
Memoria, arquivo corrompido, erro na biblioteca, erro no gerenciador do video, enfim…
Veja as mensagens de erros

J

Esse é o problema nao da nenhum erro mesmo só para de mostrar o vídeo

J

Mas esse erro também dava quando usando a outra solução ?

Erro invisível já tive muito programando em Clipper. (Aff !!, Salve Java)

São péssimos para encontrar.

Mas Java trata bem seus erros, inclusive pode ir cavando através do debug nos fontes da biblioteca.

J

Como assim outra solução? O jmf?

J

Sim

J

Nao travava, porém ele nao aceitava mp4

J

E nao testei ele todo, tipo usei ele testando pouco tempo e depois ja parti para o javafx

J

Travamento é sempre osso pra descobrir, mas me manda o fonte zipado que amanha dou uma olhadinha.

J

Quando der vc me ensina a enviar pfvr

R

Isso em web já teria resolvido o problema

J

Vc esta usando qual IDE?
E ainda sobre o reprodutor estar deixando em branco, apenas ele esta em branco ou a aplicação travou?

J

Como assim parceiro?

J

Uso o editor de texto vscode esta travando só a parte do mediaplayer nao a aplicação toda! Ele continua mostrando as senhas

J

Fica tranquilo, então isso pode ser que o programa esteja enviando um vídeo nulo para o reprodutor, mas nesse caso é para aparecer um erro, ou ainda acabou de reproduzir o video e nao tem um novo.

Porem tenho uma outra solução simples pra você testar ai, testei aqui e esta rodando certinho.

Trata-se do reprodutor vlcj

Ele esta zipado, entao descompacta e coloca todos os jars dentro do seu projeto.

Veja um exemplo completo dele rodando

Se continuar dando erro, então deve ser seu Windows, talvez vírus ou memoria, ou a logica do seu programa esta errada.

Nesse caso nao esta usando JavaFX.

/**
 *
 * @author jorge
 * 
 * download vlcj
 * https://jar-download.com/download-handling.php
 */
 
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

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

public class Main3 extends JFrame {
   private static final long serialVersionUID = 1L;
   private static final String TITLE = "My First Media Player";
   private static final String VIDEO_PATH = "/home/jorge/Vídeos/Shakira_and_Wyclef.mp4";  //  **<--- coloca o seu video correto aqui**
   private final EmbeddedMediaPlayerComponent mediaPlayerComponent;
   private JButton playButton;

   public Main3(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);    	
      contentPane.add(controlsPane, BorderLayout.SOUTH);
      playButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            mediaPlayerComponent.mediaPlayer().controls().play();
         }
      });    	 
      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);
      }
      Main3 application = new Main3(TITLE);
      application.initialize(); 
      application.setVisible(true);  
      application.loadVideo(VIDEO_PATH);
   }
}
J

Vou testar e venho te dizer, obrigado por ta me ajudando

J

Consegui reproduzir, porém em javafx tbm, só da o erro depois de que reproduz varias vezes… como eu faço para reproduzir varios videos um atras do outro no vclj e colocar dentro da minha tela principal??

J

Então João, em vlcj reproduziu e apresentou o mesmo problema que no MediaPlayer do JavaFX ou você ainda não conseguiu portar para o seu sistema?

J

Eu nao consegui colocar dentro do meu jframe

J

Esta se referindo ao vlcj ou ao MediaPlayer?

J

Ao mediaplayer, a biblioteca ja foi adicionada

J

Bom, estou certo que não é bug do MediaPlayer do JavaFX, e sim programação.

Todavia vou postar um codigo aqui pra voce ver como executar varios videos seguidos em VLCJ, basta você adaptar a Thread a sua real necessidade.

/**
 *
 * @author jorge
 * 
 * download vlcj
 * multiplos videos
 * 
 */
 
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import uk.co.caprica.vlcj.media.MediaEventListener;
import uk.co.caprica.vlcj.player.base.MediaPlayer;
import uk.co.caprica.vlcj.player.base.MediaPlayerEventAdapter;
import uk.co.caprica.vlcj.player.base.MediaPlayerEventListener;

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

public class Main3 extends JFrame implements Runnable {
   private static final long serialVersionUID = 1L;
   private static final String TITLE = "My First Media Player";
   
   Thread thread = null;
   ArrayList<String> lista = new ArrayList();
   String video_padrao = "";
   boolean end_video = false;
   MediaPlayerEventListener mevent = null;
   
   private final EmbeddedMediaPlayerComponent mediaPlayerComponent;
   private JButton playButton;

   public Main3(String title) {
      super(title);
      mediaPlayerComponent = new EmbeddedMediaPlayerComponent();		
      
      lista.add( "/home/jorge/Vídeos/legiao_urbana_giz.mp4" );
      lista.add( "/home/jorge/Vídeos/Beyonce_and_Shakira_hd.mp4" );
      //lista.add( "/home/jorge/Vídeos/Shakira_and_Wyclef.mp4" );
      //lista.add( "/home/jorge/Vídeos/legiao_urbana_pais_e_filhos.mp4");
   }
   
   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);    	
      contentPane.add(controlsPane, BorderLayout.SOUTH);
      playButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            // mediaPlayerComponent.mediaPlayer().controls().play();            
            playButton.setEnabled(false);
            thread.start();
         }
      });    	 
      this.setContentPane(contentPane);
      this.setVisible(true);
      
      thread = new Thread(this);
   }
   
   public void loadVideo(String path) {
      mediaPlayerComponent.mediaPlayer().media().startPaused(path);   	
   }
   
   
   public void run() {
      boolean run = true;
      
      
      while( run == true ) {
          
          try {
              
              for(int x=0; x < lista.size(); x++) {
                  
                 end_video = false;
                  
                 if(mevent != null )  mediaPlayerComponent.mediaPlayer().events().removeMediaPlayerEventListener(mevent);

                 mevent = new MediaPlayerEventAdapter() {
                    @Override
                    public void finished(MediaPlayer mediaPlayer) {
                        end_video = true;
                    }
                 };
                 
                 loadVideo(lista.get(x));
                 mediaPlayerComponent.mediaPlayer().events().addMediaPlayerEventListener(mevent);                  
                 mediaPlayerComponent.mediaPlayer().controls().play();
                 
                 while(end_video == false) {
                     thread.sleep(1000L);
                 }
                 
                 thread.sleep(2000L);
                 // proximo video
              }
              
          } catch (InterruptedException ex) {
              ex.printStackTrace();
          }
      }
       
   }
   
   
   public static void main( String[] args ){
      try {
         UIManager.setLookAndFeel(
         UIManager.getSystemLookAndFeelClassName());
      } 
      catch (Exception e) {
         System.out.println(e);
      }
      Main3 application = new Main3(TITLE);
      application.initialize(); 
      application.setVisible(true);  
      // application.loadVideo(VIDEO_PATH);
   }
}
J

opa, blz? como assim adaptar a thread a minha real necessidade?

J

O metodo “run()” do exemplo.Você tem conhecimento de Thread?

J

olá, não consegui usar esses exemplos que você me passou

J

acha que consegue me ajudar então ???

se o erro é a lógica de programação deve ser na hora de pegar o video

eu crio um File que entra em uma pasta e procura um arquivo que chama o video, nao o video em si para nao ficar usando memoria atoa tipo apaga video, copia video, cola video, apaga video, ele só chama o nome do video exemplo: (principal, video1, video2) enfim…

se não tiver um arquivo chamando ele joga como principal o padrão, se tiver ele pega o nome do video e joga na variavel videoAtualString, e cria um

File mediaFile = new File("/painel/videos/" + videoAtualString + “.mp4”);

que puxa direto o video somente sendo alterado o “videoAtualString” conforme tiver algum arquivo naquela pasta que te falei

J

depois seta uma media que recebe :

media = new Media(mediaFile.toURI().toURL().toString());

J

String videoAtualString = “principal”;

Scene scene;

MediaPlayer mediaPlayer;

public void pegarNomeDoVideo() {

    File nomeDoVideo = new File("/painel/vStart");

    File[] files = new File[1];

    files = nomeDoVideo.listFiles();

    if (files.length == 0) {

        videoAtualString = "principal";

    } else {

        File videoAtual = files[0];

        videoAtualString = videoAtual.toString().substring(15);

        videoAtual.delete();

    }

}

public Scene createScene() throws MalformedURLException {

    File mediaFile = new File("/painel/videos/" + videoAtualString + ".mp4");

    Media media = null;

    try {

        if(mediaFile.isFile()){

            media = new Media(mediaFile.toURI().toURL().toString());

        } else {

            mediaFile = new File("/painel/videos/principal.mp4");

            media = new Media(mediaFile.toURI().toURL().toString());

        }

    } catch (MalformedURLException e) {

        System.out.println("URL Malformed");

    }

    mediaPlayer = new MediaPlayer(media);

    mediaPlayer.setMute(true);

    mediaPlayer.setOnEndOfMedia(new Runnable() {

        @Override

        public void run() {

            try {

                juntandoInitfxEPegarNomeDoVideo();

            } catch (MalformedURLException e) {

                System.out.println("MALFORMED URL");

            }

        }

    });

    MediaView mediaview = new MediaView(mediaPlayer);

    mediaview.setFitHeight(553);

    if (videoAtualString != null) {

        scene = new Scene(new Pane(mediaview));

    }

    mediaPlayer.play();

    return scene;

}

private void initFX(JFXPanel panel) throws MalformedURLException {

    scene = createScene();

    panel.setScene(scene);

}

private void juntandoInitfxEPegarNomeDoVideo() throws MalformedURLException {

    pegarNomeDoVideo();

    initFX(fxPanel);

}
J

se realmente for algum erro de lógica eu criando uma lista por exemplo não sei… acho que daria certo

J

Realmente é problema de logica de programação. Veja tudo com calma, pedaço por pedaço do codigo usando debug e você vai encontrar o erro e corrigi-lo.

J

Tomara que seja de programação kkkkkk, sabe algum jeito de criar essa para o próximo vídeo sem travar?

J

O exemplo que postei roda vários videos e não trava.

Mas me diga, você é novato em programação ou novato em Java?

"Enganam-se aqueles que acham ou acreditam que programação seja fácil e trivial."
"Requer muito estudo, paciência e persistência."

J

É meu primeiro projeto mesmo, sem contar com os projetos de cursos

J

Mas esse em vlcj nao consegui fazer rodar infelizmente:(

J

Faça-o rodar, alias não gosto de postar teorias e achismos aqui no forum, sempre que posso posto um exemplo pratico e funcionando, esse que enviei foi testado e aprovado.

Se esta dando erro com você é preciso saber se as jars estão todas corretas, se o vlc esta instalado, enfim… essas coisinhas.

J

Esta instalado sim, porém ele abre o frame mas nao o video sabe?

J

Mas voce trocou os nomes dos videos internos?

J

Troquei

J

Entao tenta colocar no try catch um Exception pra ver se pega um erro geral

J

Se ainda assim você estiver com muitas dificuldades com o vlcj, vou lhe enviar um outro exemplo completo rodando vários videos em JavaFX.

J

Eu até prefiro em javaFx se possível

J

Tem mais documentações sobre ele na internet

J

Segue o exemplo em Swing/JavaFX rodando vários videos

TestGUJMediaPlayer.zip (111,4,KB)

Bons Codigos

J

Eu peguei esse projeto e adaptei, porém quando ele fica rodando o mesmo video e repetindo ele vai até parar de reproduzir nesse do javafx

J

Mas o exemplo que Te enviei, esta rodando os videos corretamente?

Testei o exemplo e deixei rodando um tempão e esta certo, o problema está na sua adaptação;.

J

Com o seu exemplo, somente colocando um video meu fica assim, ele roda algumas vezes e fica desse jeito da foto depois de um tempo

J

Me manda de volta um arquivo zipado com o seu video que fica preto, e vamos ver o que você mexeu dentro que esta acontecendo isso.

Qualquer coisa tenta roda em outro computador pra ver se vai.

J

Vou te enviar o .java q eu mexi, nao é questão do pc provavelmente pq tenho um not q tbm ficava branco naquele outro painel entao provavelmente nesse tbm ficaria preto

Criado 28 de julho de 2022
Ultima resposta 13 de set. de 2022
Respostas 88
Participantes 4