23 de jul. de 2012

Tocando Áudio e Vídeo

Nesse artigo vamos mostrar como criar aplicações com capacidade de tocar áudio e vídeo com JavaFX. Serão mostradas duas aplicações bastante simples com o objetivo de mostrar essas características. Futuramente teremos artigos mais avançados nesse assunto.
Se você nunca fez nada com JavaFX até agora sugiro que você dê uma olhada nesse post para criar sua primeira aplicação. A partir dele você estará preparado para esse artigo.

Carregando, tocando e mostrando um vídeo

Tocar vídeo em JavaFX é tão simples que chega a assustar quem já tentou tocar um vídeo usando Java anteriormente. Nós só temos que seguir três pequenos passos:
  1. Carregar. Você primeiramente deve carregar a mídia que vai tocar. A mídia pode estar no seu disco rígido como em um um servidor.
  2. Tocar. A partir da mídia, você deverá controlar a mesma: tocar, parar, pausar, etc.
  3. Mostrar. Nesse ponto iremos colocar o vídeo dentro de sua aplicação JavaFX.
Para realizar esses três passos temos três classes JavaFX que ficam no pacote javafx.scene.media. Para 1 nós temos a classe Media, 2 podemos fazer com a classe MediaPlayer e finalmente conseguimos o passo três com o uso da MediaView. O uso dessas classes é muito simples, abaixo temos o código de um aplicação de exemplo e em seguida um breve explicação de cada linha nova. 

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.Stage;

public class TocandoVideo extends Application {

 private String VIDEO_URL = getClass().getResource(
   "/video/creativecommons.mp4").toString();

 public static void main(String[] args) {
  launch();
 }

 @Override
 public void start(Stage palco) throws Exception {

  Media media = new Media(VIDEO_URL); // 1
  MediaPlayer mediaPlayer = new MediaPlayer(media); // 2
  MediaView mediaView = new MediaView(mediaPlayer); // 3

  StackPane raiz = new StackPane();
  raiz.getChildren().add(mediaView); // 4
  Scene cena = new Scene(raiz, 600, 400);
  palco.setTitle("Tocando Video em JavaFX");
  palco.setScene(cena);
  palco.show();

  mediaPlayer.play(); // 4
 }
}
  1. Nessa linha estamos carregando o nosso vídeo. No construtor é recebido a URL do vídeo que pode ser ou um arquivo local ou um link para um vídeo publicado em algum servidor;
  2. Após informar a mídia, nós temos que criar um player ("tocador") que será responsável por interagir com a midia em sí e assim poder tocar, parar, pausar (entre outras ações) o referido vídeo.
  3. Nós já temos o vídeo e já sabemos como controlar ele, no entanto, temos que adicionar ele a nossa aplicação JavaFX para que o vídeo seja mostrado. 
  4. O MediaView é uma classe que herda de  Node, ou seja, podemos adicionar ele a qualquer Node que herda de Parent (não se preocupe, futuramente teremos posts específicos sobre essas classes). Nessa linha nós adicionamos o vídeo ao pai.
  5. Por fim tocamos o vídeo através do método play(). Há também outros métodos para controle do vídeo, sendo possível criar um player dinâmico, iremos mostrar isso no futuro também
Conforme mostrado acima, são quatro linhas para podermos tocar um vídeo em uma aplicação JavaFX. Veja abaixo o resultado:

Carregando e tocando áudio

Se tocar vídeo exige menos de 4 linhas de código, tocar áudio exige ainda menos: 2. Semelhante ao que fizemos com vídeo, o áudio deve ser carregado e então tocado. O áudio, no entanto, não dispõe de uma classe para visualização, já que essa não é necessária e temos somente uma classe necessária para a carga e execução do áudio, a classe AudioClip. Claro que você pode criar um player se achar necessário. Vejam abaixo o código de uma pequena aplicação de exemplo:


import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.media.AudioClip;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class TocandoAudio extends Application {

 private String AUDIO_URL = getClass().getResource(
   "/audio/top-jamendo.mp3").toString();

 public static void main(String[] args) {
  launch();
 }

 @Override
 public void start(Stage palco) throws Exception {
  AudioClip clip = new AudioClip(AUDIO_URL);// 1
  clip.play(); // 2
  StackPane raiz = new StackPane();
  raiz.getChildren().add(new Text("Tocando Música ")); //3
  Scene cena = new Scene(raiz, 600, 100);
  palco.setTitle("Tocando Audio em JavaFX");
  palco.setScene(cena);
  palco.show();

 }
}
  1. Aqui carregamos o clipe de áudio e informamos a URL do audio a ser tocado;
  2. O áudio irá começar a tocar nessa linha. Semelhante ao vídeo, temos vários outros métodos que poderíamos utilizar
  3. Não é relacionado ao áudio, mas essa linha adiciona um simples texto informativo, pois não temos nada visual quanto tocamos áudio

Conclusão

Tocar conteúdo multimídia usando Java nunca foi tão fácil! Obviamente mostramos aqui a forma mais simples de fazer isso, mas você pode explorar a documentação para criar aplicações mais elaboradas.
Baixe os projetos do Eclipse abaixo(em breve adicionarei os links). As mídias usadas estão dentro de cada projeto, isso deixou os projetos com alguns "megas" a mais. Usamos o vídeo de apresentação do conceito de Creative Commons e o áudio foi o top do Jamendo nesse momento: All I'll Ever Need - Sean Fournier.

11 comentários:

  1. ola amigo, vc pretende fazer alguns tutoriais sobre o editor scene builder?

    ResponderExcluir
  2. Olá Roney,

    futuramente só, por enquanto iremos só apresentar as principais características do JavaFX

    ResponderExcluir
    Respostas
    1. ola tenho o netbems a ultima versao configurei para java fx colei o seu codigo
      nao deu erro mas nao rodou somente uma mensagen javadoc nao encontrado

      Excluir
  3. boa tarde, não estou conseguindo colocar o player pra rodar, criei uma janela com um botão para audio e outra para o vídeo a do audio funciona normalmente, mas a do video não. segue sempre a mensagem de erro:
    um RuntimeException causada por:

    Caused by: MediaException: MEDIA_UNSUPPORTED : Unrecognized file signature!
    como posso corrigir isso?
    o mesmo acontece com o pacote disponibilizado pelo blog.

    ResponderExcluir
  4. Olá Daniel,

    Qual a versão do Java? Isso aí foi testado com o Java 7 e JavaFX 2.2, não testei com o 8 ainda.

    ResponderExcluir
  5. A linha 10/11 esta a dar erro . o que que eu fiz errado eu copiei tudo so troquei as musicas criei as pastas ?

    ResponderExcluir
  6. como eu boto botoes de play,stop entre outros???

    ResponderExcluir
  7. Seria possível disponibilizar o código fonte "rodando" para fazer alguns testes ?

    ResponderExcluir
  8. Boa tarde!

    Como faço para colocar uma ação para quando o vídeo acabar de reproduzir?

    ResponderExcluir
  9. CARA VOCê FEZ UM OTIMO TRABALHO PARABÉNS

    ResponderExcluir