[RESOLVIDO] lista de reprodução

15 respostas
D
Estou tentando fazer um player com uma lista de reprodução o nome das musicas estao como 1.mp3 2.mp3 assim por diante e a cada 3 musicas tem q tocar uma musica especial que e d1 então tentei colocar os endereços por meio de variaveis para que possa somar tipo 1 + 2.mp3 fica 3.mp3. So que não consegui fazer rodar assim.
package program;

import jaco.mp3.player.MP3Player;
import java.io.File;

public class Tocador {
	public void Tocador()throws Exception{
		
		  int a = 1;
		  int b = a + 1;
		  int c = b + 1;
		  int d = 1;
		  
		  String na = Integer.toString(a) + ".mp3";
		  String nb = Integer.toString(b) + ".mp3";
		  String nc = Integer.toString(c) + ".mp3";
		  String nd = Integer.toString(d) + ".mp3";
		  
		  
		  File f1 =  new File(na);
		  File f2 = new File(nb);
		  File f3 =  new File(nc);
		  File f4 =  new File(nd);
		  
	
		new MP3Player(f1, f2, f3 ,f4).play();

	
	
	}
	
	

}

15 Respostas

C
digolipertte o método
mp3.play()
como foi implementado dispara 2 threads para cuidar da execução dos seus mp3s, entretanto, isso é desconsiderado para o programa em si, logo o main termina a execução, consequentemente a execução do mp3 é forçada a parar, você pode criar uma thread que controle enquanto estiver executando seus mp3s por exemplo:
package program;  
  
import jaco.mp3.player.MP3Player;  
import java.io.File;  
  
public class Tocador {  
    public void Tocador()throws Exception{  
          
          int a = 1;  
          int b = a + 1;  
          int c = b + 1;  
          int d = 1;  
            
          String na = Integer.toString(a) + ".mp3";  
          String nb = Integer.toString(b) + ".mp3";  
          String nc = Integer.toString(c) + ".mp3";  
          String nd = Integer.toString(d) + ".mp3";  
            
            
          final File f1 =  new File(na);  
          final File f2 = new File(nb);  
          final File f3 =  new File(nc);  
          final File f4 =  new File(nd);  
            
      
         Thread playing = new Thread(new Runnable() {  //thread controla o MP3Player
			
			@Override
			public void run(){
			    MP3Player mp3 = new MP3Player(f1,f2,f3,f4);
			    mp3.play();
				while(!mp3.isStopped());   //enquanto não parar o MP3Player
			}
		 });
         playing.start();
      
    }  
      
      
  
}

Não sei se foi exatamente isso o problema, qualquer coisa posta aí de novo

D
a primeira vez que eu tentei fazer rodar mp3 eu fiz assim.
package jaco.mp3.player.examples;

import jaco.mp3.player.MP3Player;

import java.io.File;

public class Tocador {

  public  Tocador (String[] args) {
    new MP3Player(new File("teste.mp3")).play();
  }

}
dai eu fiz do outro jeito que postei ai em cima e cada vez que eu abria tocava a musica teste.mp3 do primeiro exemplo. achei que fosse algum erro que havia cometido mas dai tentei do jeito que vc falou e deu a mesma coisa. Esta tocando o teste.mp3 e não sei como pq eu apaguei o codigo antigo pra botar o novo.[code]
D
C.Porto tem como fazer o programa tocar duas musicas de uma pasta e uma da outra pasta? Mas que o programa escolha as musicas sozinho para que não seja sempre as mesmas?
import jaco.mp3.player.MP3Player;    
import java.io.File;  




public class Tocador {

	public Tocador (){
		
		 File file1 = new File("1.mp3");
		    File file2 = new File("2.mp3");
		    File file3 = new File("3.mp3");

		    new MP3Player(file1, file2, file3).play();
		
		
		
		
		
		
	}
}
C

Não entendi muito bem a dúvida, nesse caso:

import jaco.mp3.player.MP3Player;      
import java.io.File;    
  
  
  
  
public class Tocador {  
  
    public Tocador (){  
          
         File file1 = new File("1.mp3");  
            File file2 = new File("2.mp3");  
            File file3 = new File("3.mp3");  
  
            new MP3Player(file1, file2, file3).play();  
          
          
          
          
          
          
    }  
}

pelo o que eu entendi você está passando 2 músicas de uma pasta e 1 de outra pasta, assim o MP3Player vai executar primeiro a “1.mp3” depois “2.mp3” e por último “3.mp3”, e então ele vai parar, pois acabou de tocar toda sua playlist, caso você queira que ele fique tocando a playlist:

mp3.setRepeat(true);

ou caso você queira que ele continue tocando essas músicas mas randômicamente:

mp3.setShuffle(true);

Fora isso não tem como o MP3Player tocar músicas que ele não possui na playlist, caso não tenha sido essa a dúvida posta aí de novo explicando melhor.

D
Gostaria que o file1 pegase uma musica da pasta musicas. o file 2 pegase mais uma musica da pasta musicas. e o file 3 pegase um arquivo da pasta comercial. So que ao inves de eu indicar a musica o programa escolher qual vai ser tocada dai eu queria colocar isso dentro de um while para repitir a ação sempre mudando as musicas.
import jaco.mp3.player.MP3Player;    
import java.io.File;  




public class Tocador {

	public Tocador (){
		while (1< 10){ 
		 File file1 = new File("musicas"); //aqui o programa escolhece uma musica qualquer
		    File file2 = new File("musicas");//aqui escolher outra musica qualquer dentro da pasta musicas
		    File file3 = new File("comercial");//aqui escolher um comercial

		    new MP3Player(file1, file2, file3).play();
		
		
		
		
		
		}
	}
}
E que esse programa vai rodar o dia todo dentro de uma loja e tem que tocar duas musicas e uma propaganda e tem que tocar as musicas sem que fique todo o dia com a mesma lista de reprodução todo dia o mesmo horario tocar a mesma musica.
C

Vamos ver se eu entendi, vão tocar 2 músicas e após isso uma música de comercial, mas elas são escolhidas aleatoriamente dentro da pasta “Música” e da pasta “Comercial”,
você pode tentar fazer o seguinte:

import jaco.mp3.player.MP3Player;

import java.io.File;
import java.util.Random;

public class Tocador {

	private static final File[] listMusic = new File("Pasta das Músicas").listFiles();  //poem a pasta das musicas
	private static final File[] listComercial = new File("Pasta dos Comerciais").listFiles(); //poem a pasta dos comerciais
	private static Thread control = null;
	private static MP3Player mp3;
	
	public Tocador()
	{
		Random r = new Random();
		
		while(true)
		{
			if(control == null)
			{
			       final File file1 = listMusic[r.nextInt(listMusic.length)];
	               final File file2 = listMusic[r.nextInt(listMusic.length)];    
	               final File file3 = listComercial[r.nextInt(listComercial.length)];
	         
	               control = new Thread(new Runnable() {
				
				@Override
				public void run() {
				    mp3 = new MP3Player(file1,file2,file3);
					mp3.play();
					mp3IsStillPlaying();
				  }
			   });
	          
	          control.start();
		  }
		  else
		  {
			  if(!control.isAlive())
			  {
				  control.interrupt();
				  control = null;
			  }
		  }
	   }
	
	}
	
	private static void mp3IsStillPlaying()
	{
		boolean playing = true;
		while(playing)
		{
			if(mp3.isStopped())
			{
				try {
					Thread.sleep(5000);
					if(mp3.isStopped())
					{
						playing = false;
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

Como ta escrito nos 2 comentários das linhas 08 e 09, é só você trocar as pastas das músicas e comerciais pelas suas que vai rodar certinho, provavelmente…
Ficou meio ganbiarra, devido à alguns problemas relacionados à classe MP3Player, mas qualquer dúvida ou problema posta aí de novo.

D
C.Porto era exatamente isso que eu precisava, so agora deu um pequeno probleminha meu JFrame sumiu não ta mais aparecendo. acho que algo bem simples mas não sei oque esta acontecendo. vou postar o código da classe principal aqui.
import java.awt.*;

import javax.swing.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;





public class Principal {
	
	public static void main (String [] args) throws Exception {
		
		JFrame janela = new JFrame(); 
		JButton botao = new JButton("Sair");
		
	 	
		new Tocador ();
		
		janela.setSize(700, 250);
        janela.setLayout(null);
        janela.getContentPane().setBackground(Color.black);		

        
        janela.add(botao);
        botao.setSize(70, 30);
		botao.setBackground(Color.GRAY);
        botao.setLocation(620, 5);
        
        botao.addActionListener(new ActionListener() {    
           
			
			
            @Override    
            public void actionPerformed(ActionEvent arg0) {    
                   
            	   int i = JOptionPane.showConfirmDialog(null ,"Deseja fechar a aplicação?", 
            			   "Saída",JOptionPane.YES_NO_OPTION); 
            	   if (i == JOptionPane.YES_OPTION ) { 
            	   System.exit(0); 
            	   }   
                  
            }    
        });
		
		
		janela.setLocationRelativeTo(null);
        janela.setUndecorated(true);
        janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		janela.setVisible(true);
		
		
		
	}

}
C

O problema dessa vez é simples, a execução do programa fica presa dentro do:

new Tocador()

então só mudar ele para ser o último comando a ser executado:

import java.awt.*;  
  
import javax.swing.*;  
  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
  
  
  
  
  
public class Principal {  
      
    public static void main (String [] args) throws Exception {  
          
        JFrame janela = new JFrame();   
        JButton botao = new JButton("Sair");  
          
        janela.setSize(700, 250);  
        janela.setLayout(null);  
        janela.getContentPane().setBackground(Color.black);       
  
          
        janela.add(botao);  
        botao.setSize(70, 30);  
        botao.setBackground(Color.GRAY);  
        botao.setLocation(620, 5);  
          
        botao.addActionListener(new ActionListener() {      
             
              
              
            @Override      
            public void actionPerformed(ActionEvent arg0) {      
                     
                   int i = JOptionPane.showConfirmDialog(null ,"Deseja fechar a aplicação?",   
                           "Saída",JOptionPane.YES_NO_OPTION);   
                   if (i == JOptionPane.YES_OPTION ) {   
                   System.exit(0);   
                   }     
                    
            }      
        });  
          
          
        janela.setLocationRelativeTo(null);  
        janela.setUndecorated(true);  
        janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        janela.setVisible(true);  
          
        new Tocador ();  
          
    }  
  
}

E vai estar funcionando.

D

Cara funcionou. Um dia eu vou ser um bom programador assim. kkk valeu.
Só mais uma perguntinha pra finalizar meu programinha. Se eu quiser pegar o nome da musica e passar pra uma variavel tem como?

C

Tem sim, após serem randomicamente escolhidas as músicas você pode fazer isto:

final File file1 = listMusic[r.nextInt(listMusic.length)];      
final File file2 = listMusic[r.nextInt(listMusic.length)];          
final File file3 = listComercial[r.nextInt(listComercial.length)];  
   
String titulo1,titulo2,titulo3;    
                       
titulo1 = file1.getName();    
titulo2 = file2.getName();    
titulo3 = file3.getName();

depende do que você quer fazer com as Strings pode ser como variável local ou como atributo.

D

eu quero exibir o nome da musica que esta tocando e o nome da música que acabou de tocar na tela do meu player.

C
Nesse caso é algo bem diferente do que gerir uma lista de reprodução, eu aconselharia estender a classe Tocador com JPanel para depois adicionar à um JFrame, e adicionar os Labels dentro da classe para mostrar a música que está sendo tocada no momento e a música que acabou de tocar, embora isso seja um pouco complicado considerando o que oferece a classe MP3Player, tenta codificar primeiro o que tu acha que tem que ser feito. De qualquer jeito:
final File file1 = listMusic[r.nextInt(listMusic.length)];        
final File file2 = listMusic[r.nextInt(listMusic.length)];            
final File file3 = listComercial[r.nextInt(listComercial.length)];    
     
String titulo1,titulo2,titulo3;      
                         
titulo1 = file1.getName();      
titulo2 = file2.getName();      
titulo3 = file3.getName();
Fazendo isso você obtém os nomes dos arquivos .mp3 Qualquer problema ou dúvida posta aí.
D
existe algo do tipo?

While(file1.playing()) {

titulo1 = file1.getName();

}

elso{

titulo2 = titulo1;

}

Se existem como fazer isso ia dar certo. tem algum comando que diga quando a musica esta tocando? Esse .playing(); eu imaginei…
C

E aí companheiro,

Infelizmente não tem como fazer isso que você está pensando:

while(file1.playing()) { 
titulo1 = file1.getName(); 
} 
else{ 
titulo2 = titulo1; 
}

Mas, como o código está meio na gambiarra vou te passar a barbada aqui, existem algumas modificações:

Tocador

import jaco.mp3.player.MP3Player;  

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;  
import java.util.Random;  

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
  
public class Tocador extends JPanel{  
  
    private static final File[] listMusic = new File("pasta das musicas").listFiles();  //poem a pasta das musicas  
    private static final File[] listComercial = new File("pasta dos comerciais").listFiles(); //poem a pasta dos comerciais  
    private Thread control;  
    private MP3Player mp3;  
    private String t1,t2,t3;
    private JLabel label;
    private JButton leave;
    private int index;
      
    public Tocador()  
    {  
    	super(new BorderLayout());
        
        label = new JLabel();
        leave = new JButton("Sair");
        
        leave.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				int i = JOptionPane.showConfirmDialog(null ,"Deseja fechar a aplicação?",   
                        "Saída",JOptionPane.YES_NO_OPTION);   
                if (i == JOptionPane.YES_OPTION ) {   
                      System.exit(0);   
                }     
			}
		});
        
        this.add(label, BorderLayout.NORTH);
        this.add(leave, BorderLayout.CENTER);
      
    } 
    
    public void play()
    {
    	Random r = new Random();
    	
    	 while(true)  
         {  
             if(control == null)  
             {  
                    final File file1 = listMusic[r.nextInt(listMusic.length)];  
                    final File file2 = listMusic[r.nextInt(listMusic.length)];      
                    final File file3 = listComercial[r.nextInt(listComercial.length)];  
                    
                
                    t1 = file1.getName();
                    t2 = file2.getName();
                    t3 = file3.getName();
                    
                    control = new Thread(new Runnable() {  
                   
                 @Override  
                 public void run() {  
                     mp3 = new MP3Player(file1,file2,file3);  
                     mp3.play();  
                     mp3IsStillPlaying();  
                   }  
                });  
               control.start();  
           }  
           else  
           {  
               if(!control.isAlive())  
               {  
                   control.interrupt();  
                   control = null;  
               }  
           }  
        }  
    }
    
    private String musicListener(int op)
    {
    	switch(op)
    	{
    	   case 1:
    		   return t1;
    	   case 2:
    		   return t2;
    	   case 3:
    		   return t3;
    	   default:
    		   return "";
       }
    }
      
    private void mp3IsStillPlaying()  
    {  
        boolean playing = true;  
        index = 1;
        label.setText(musicListener(index));
        while(playing)  
        {  
            if(mp3.isStopped())  
            {  
            	//momento em que troca de música
            	index++;
            	label.setText(musicListener(index));
                try {  
                    Thread.sleep(3000);  
                    if(mp3.isStopped())  
                    {  
                        playing = false;  
                    }  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
}

Principal

import java.awt.*;  

import javax.swing.*;  
  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener; 

public class Principal {

	public static void main (String [] args) throws Exception {  
        
        JFrame janela = new JFrame();   
        janela.setSize(700, 250);  
        janela.setLocationRelativeTo(null);   
        janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        janela.setUndecorated(true);
        Tocador player = new Tocador();
        janela.setContentPane(player);
        janela.setVisible(true);  
        player.play();
          
    }  
	
}

Existem algumas modificações que tiveram que ser feitas, mas em suma acho que foi mantido o que você estava fazendo e está funcionando, só tem um mas, o modo como está codificado, o player está mostrando apenas a música que está tocando no momento, se você quiser outras funcionalidades, vai ter que correr atrás e codificar, o código está realmente específico, então vai ser difícil.
Qualquer dúvida posta aí de novo.

D

Obrigado C.Porto Era isso mesmo que eu precisava. está concluído o projeto do player.

Criado 26 de abril de 2012
Ultima resposta 11 de mai. de 2012
Respostas 15
Participantes 2