quarta-feira, 18 de janeiro de 2012

Executar Audio em Java Swing



Uma das coisas que mais motivam nós programadores quando estamos aprendendo a programar ou que continuemos a estudar a linguagem a qual programamos é aprender sempre algo novo que a linguagem nos oferece. Claro que Java nos permite hoje fazer qualquer tipo de aplicação, porém o grande problema é que não sabemos como fazer o que queremos e a partir da aí buscamos cada vez mais o conhecimento que precisamos para fazer o que desejamos.
Recentemente descobri essa biblioteca chamada JLayer a qual nos permite tocar de forma muito fácil arquivos MP3 em nossos programas Java. Eu ainda não estudei essa biblioteca profundamente para ver tudo o que ela tem, porém hoje eu mostro como fazer o básico para tocar arquivos MP3 usando a Jlayer.
O tutorial é dividido em duas partes. A primeira parte (logo a seguir) ensina a tocar um arquivo mp3 em código Java de forma bem simples. Na segunda parte (que publicarei algum dia), ensinarei a tocar o arquivo mp3 usando threads e mostrando alguns outros recursos do JLayer.
Para fazer este tutorial, eu estou usando o seguinte ambiente de desenvolvimento:
  • JDK 1.6
  • JLayer 1.0.1
  • Netbeans 7.0 
  • Windows 7
A primeira coisa que devemos fazer é baixa a biblioteca JLayer. A biblioteca é grátis(LGPL) e você pode fazer o download dos binários e fontes aqui:http://www.javazoom.net/javalayer/javalayer.html
Depois de feito o download, descompacte o arquivo e copie o arquivo jl1.0.1.jar para a pasta lib de seu projeto. Copiado o jar, adicione a biblioteca ao classpath do projeto. Feito isso, vamos criar uma classe que será responsável por tocar nosso arquivo MP3. Eu chamei a classe de MP3 e ela ficou dessa forma:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.meupost.player;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import javazoom.jl.player.Player;
public class MP3 {
  /**
   * Objeto para nosso arquivo MP3 a ser tocado
   */
  private File mp3;
  /**
   * Objeto Player da biblioteca jLayer. Ele tocará o arquivo
   * MP3
   */
  private Player player;
  /**
   * Construtor que recebe o objeto File referenciando o arquivo
   * MP3 a ser tocado e atribui ao atributo MP3 da classe.
   *
   * @param mp3
   */
  public MP3(File mp3) {
    this.mp3 = mp3;
  }
  /**
   * Método que toca o MP3
   */
  public void play() {
      try {
                FileInputStream fis     = new FileInputStream(mp3);
                BufferedInputStream bis = new BufferedInputStream(fis);
                this.player = new Player(bis);
                System.out.println("Tocando!");
                this.player.play();
                System.out.println("Terminado!");
            }
            catch (Exception e) {
                System.out.println("Problema ao tocar " + mp3);
                e.printStackTrace();
            }
     }
}
A classe está comentada e explica o que significa os atributos e os métodos. No métodoplay(), vemos que um objeto FileInputStream e BufferedInputStream são instanciados. O Player da biblioteca JLayer usa o BufferedInputStream para poder instanciar e deixar pronto o objeto Playero qual nos permite enfim, tocar a música. O método play() do objeto Player é o responsável pela execução da música.
Note que como esse exemplo não é multithread, a música começará a tocar no momento da chamada do método play() e o fluxo de execução irá parar nesse método. O fluxo somente retornará quando a música terminar. Por fim, se ocorrer qualquer erro na execução da música, esteremos capturando a exceção e exibindo o stackTrace da mesma.
Terminada essa nossa classe MP3, vamos criar uma classe Main que instancia nossa classe MP3 e que permita nós testarmos a classe MP3 para ver se realmente funciona.
Eu criei uma classe Main assim:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
package com.meupost.main;
import java.io.File;
import com.meupost.player.MP3;
public class Main {
  public static void main(String[] args) {
    //String com o caminho do arquivo MP3 a ser tocado
    String path = "/home/ricardo/Músicas/Rock Clássico/Eagles - Hotel California.mp3";
    //Instanciação de um objeto File com o arquivo MP3
    File mp3File = new File(path);
    //Instanciação do Objeto MP3, a qual criamos a classe.
    MP3 musica = new MP3(mp3File);
    //Finalmente a chamada do método que toca a música
    musica.play();
  }
}
As quatro linhas de código nela estão comentadas e falam o que é cada comando. Acredito que você já possa testar e ver se funciona. Mande um Play aí.
Espero que tenham gostado. É bem simples, mas muito legal. No próximo tutorial mostrarei como fazer um tocador mais complexo utilizando threads.

12 comentários:

  1. Respostas
    1. Caro mateus. Primeiramente obrigado por participar deste blog!

      Respondendo sua pergunta, creio que queiras parar o tocador. Para isso você pode usar o método close();
      Exemplo:

      musica.close();

      Ele para qualquer arquivo de audio que estiver sendo executado.
      Espero que tenha sido útil.

      Se possível participe siga este blog ou faça parte de nossa página no Facebook

      https://www.facebook.com/Javanamente?bookmark_t=page

      Abraços!

      Excluir
  2. Aqui não pegou =/
    Não tem erro, simplesmente não tocou o arquivo mp3. Oq pode ser ?

    ResponderExcluir
  3. Paulo, não houve erro? você colocou o caminho certo do arquivo? verificou se sua placa de áudio esta realmente funcionando? implementou de forma correta a classe Mp3 com a chamada ao método play? Abraços!

    ResponderExcluir
  4. Respostas
    1. crie estas varíáveis de exemplo:

      player = null;
      FIS = null;
      valid = false;
      BIS = null;
      path = null;
      total = 0;
      stopped = 0;
      canResume = false;

      e depois crie um método pause:

      public void pause(){
      try{

      stopped = FIS.available();
      player.close();
      FIS = null;
      BIS = null;
      player = null;

      if(valid) canResume = true;

      }catch(Exception e){

      }

      Excluir
  5. Como pegar os minutos da música que está tocando?

    ResponderExcluir

Admin: Bruno

Olá Galera! muito grato por estarem acessando nosso blog. Espero que seja possível transmitir de forma compreensível um pouco de meus conhecimentos em programação, para esta comunidade de desenvolvedores que cresce cada vez mais! Espero que Gostem! Abraço! E meu enorme obrigado à Renato Simões, Átila Soares,Wanderson Quinto, Emerson e a toda galera que sempre ajudou meu sincero obrigado....
Especialmente a Natalia Failache e Rita de Cassia que sempre apoiaram este sonho....

De seu amigo Bruno Rafael.