Jogando .mp3 e .wav em Java?


105

Como posso reproduzir um .mp3e um .wavarquivo em meu aplicativo Java? Estou usando o Swing. Tentei procurar na internet algo como este exemplo:

public void playSound() {
    try {
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("D:/MusicPlayer/fml.mp3").getAbsoluteFile());
        Clip clip = AudioSystem.getClip();
        clip.open(audioInputStream);
        clip.start();
    } catch(Exception ex) {
        System.out.println("Error with playing sound.");
        ex.printStackTrace();
    }
}

Mas, isso só reproduzirá .wavarquivos.

O mesmo com:

http://www.javaworld.com/javaworld/javatips/jw-javatip24.html

Desejo reproduzir .mp3arquivos e .wavarquivos com o mesmo método.


1
Parece que você precisará de algum tipo de plugin. JMF deve ter o que você precisa. oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
Otra

Bem, eu não tenho certeza de como usar essas coisas, eu nunca usei antes. Como posso implantar, como posso usar?
Stan

O JFM foi abandonado em 2003. Não é recomendado que você o use.
joshreesjones

3
É importante notar que, em um mainmétodo, é necessário adicionar um Thread.sleeppara ouvir o som, ou o programa será encerrado antes que isso aconteça. Uma forma útil de fazer isso é:Thread.sleep(clip.getMicrosecondLength() / 1000);
André Valenti

Respostas:


119

Java FX tem Mediae MediaPlayerclasses que irá reproduzir arquivos MP3.

Código de exemplo:

String bip = "bip.mp3";
Media hit = new Media(new File(bip).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(hit);
mediaPlayer.play();

Você precisará das seguintes instruções de importação:

import java.io.File;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

5
recurso de URL final = getClass (). getResource ("a.mp3");
Neil

44
isso não está funcionando para mim em tudo. diz que as importações não existem. e estou executando o java 7 ...
PulsePanda

9
stackoverflow.com/questions/15149547/… Parece que você precisa adicionar manualmente a biblioteca javafx de dentro da pasta Java 7 se você usar o Eclipse.
Gyurme de

7
Tecnicamente, Mediae MediaPlayernão são classes Java , mas classes JavaFX . Para adicionar suporte a mp3 para Java no OS X ou Windows, você pode querer dar uma olhada no SampledSP . E sim - eu escrevi essas bibliotecas.
Hendrik

8
Não se esqueça de que você também precisa inicializar o javaFX para que isso funcione. stackoverflow.com/questions/14025718/…
user738048


18

você pode jogar .wav apenas com a API Java:

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

código:

AudioInputStream audioIn = AudioSystem.getAudioInputStream(MyClazz.class.getResource("music.wav"));
Clip clip = AudioSystem.getClip();
clip.open(audioIn);
clip.start();

E jogue .mp3 com jLayer


4
Isto está errado. Java reproduzirá outros formatos de contêiner além do wav. Além disso, wav é um formato de contêiner que pode conter até mp3. Portanto, o Java não pode reproduzir todos os arquivos WAV.
Radiodef de

15

Já faz um tempo que não uso, mas o JavaLayer é ótimo para reprodução de MP3


Sim, é muito legal. Simples e não parece dependente da plataforma. Funciona bem em um plano de fundo e só precisa descobrir como interromper uma discussão.
James P.

14

Usando a API javax.sound padrão, uma única dependência Maven, totalmente Open Source ( Java 7 necessário):

pom.xml

 <!-- 
    We have to explicitly instruct Maven to use tritonus-share 0.3.7-2 
    and NOT 0.3.7-1, otherwise vorbisspi won't work.
   -->
<dependency>
  <groupId>com.googlecode.soundlibs</groupId>
  <artifactId>tritonus-share</artifactId>
  <version>0.3.7-2</version>
</dependency>
<dependency>
  <groupId>com.googlecode.soundlibs</groupId>
  <artifactId>mp3spi</artifactId>
  <version>1.9.5-1</version>
</dependency>
<dependency>
  <groupId>com.googlecode.soundlibs</groupId>
  <artifactId>vorbisspi</artifactId>
  <version>1.0.3-1</version>
</dependency>

Código

import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine.Info;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;

import static javax.sound.sampled.AudioSystem.getAudioInputStream;
import static javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED;

public class AudioFilePlayer {

    public static void main(String[] args) {
        final AudioFilePlayer player = new AudioFilePlayer ();
        player.play("something.mp3");
        player.play("something.ogg");
    }

    public void play(String filePath) {
        final File file = new File(filePath);

        try (final AudioInputStream in = getAudioInputStream(file)) {

            final AudioFormat outFormat = getOutFormat(in.getFormat());
            final Info info = new Info(SourceDataLine.class, outFormat);

            try (final SourceDataLine line =
                     (SourceDataLine) AudioSystem.getLine(info)) {

                if (line != null) {
                    line.open(outFormat);
                    line.start();
                    stream(getAudioInputStream(outFormat, in), line);
                    line.drain();
                    line.stop();
                }
            }

        } catch (UnsupportedAudioFileException 
               | LineUnavailableException 
               | IOException e) {
            throw new IllegalStateException(e);
        }
    }

    private AudioFormat getOutFormat(AudioFormat inFormat) {
        final int ch = inFormat.getChannels();

        final float rate = inFormat.getSampleRate();
        return new AudioFormat(PCM_SIGNED, rate, 16, ch, ch * 2, rate, false);
    }

    private void stream(AudioInputStream in, SourceDataLine line) 
        throws IOException {
        final byte[] buffer = new byte[4096];
        for (int n = 0; n != -1; n = in.read(buffer, 0, buffer.length)) {
            line.write(buffer, 0, n);
        }
    }
}

Referências:


Estou recebendo este erro para mp3 e ogg: UnsupportedAudioFileException: não foi possível obter o fluxo de entrada de áudio do arquivo de entrada
David Winiecki

Coloquei o código em um módulo Maven. Definitivamente funciona: search.maven.org/…
odoepner

eu poderia atualizar os números da versão para: <dependency> <groupId> com.googlecode.soundlibs </groupId> <artifactId> tritonus-share </artifactId> <version> 0.3.7.4 </version> </dependency> <dependency> <groupId> com.googlecode.soundlibs </groupId> <artifactId> mp3spi </artifactId> <version> 1.9.5.4 </version> </dependency> <dependency> <groupId> com.googlecode.soundlibs </groupId> < artifactId> vorbisspi </artifactId> <version> 1.0.3-2 </version> </dependency>
tibi

apenas verbisspi 1.0.3.3, que é o mais recente, não funcionou.
Tibi

Isso é ótimo, funciona com MP3 e WAV assim que sai da caixa!
Miles Henrichs

13

Eu recomendaria usar o BasicPlayerAPI. É open source, muito simples e não requer JavaFX. http://www.javazoom.net/jlgui/api.html

Depois de baixar e extrair o arquivo zip, deve-se adicionar os seguintes arquivos jar ao caminho de construção do projeto:

  • basicplayer3.0.jar
  • todos os jars do diretório lib (dentro de BasicPlayer3.0)

Aqui está um exemplo de uso minimalista:

String songName = "HungryKidsofHungary-ScatteredDiamonds.mp3";
String pathToMp3 = System.getProperty("user.dir") +"/"+ songName;
BasicPlayer player = new BasicPlayer();
try {
    player.open(new URL("file:///" + pathToMp3));
    player.play();
} catch (BasicPlayerException | MalformedURLException e) {
    e.printStackTrace();
}

Importações necessárias:

import java.net.MalformedURLException;
import java.net.URL;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerException;

Isso é tudo que você precisa para começar a tocar música. O Player está iniciando e gerenciando seu próprio thread de reprodução e fornece reprodução, pausa, retomada, parada e busca .

Para um uso mais avançado, você pode dar uma olhada no jlGui Music Player. É um clone do WinAmp de código aberto: http://www.javazoom.net/jlgui/jlgui.html

A primeira classe a ser examinada seria PlayerUI (dentro do pacote javazoom.jlgui.player.amp). Ele demonstra os recursos avançados do BasicPlayer muito bem.


Obrigado, esta é a maneira mais fácil que tentei adicionar suporte a mp3 para um aplicativo atual. mp3spi1.9.4.jardeve ser substituído pelo mp3spi1.9.5.jardo site java zoom.
Old Badman Gray

Não se esqueça de dormir seu tópico principal depois player.play()ou você não ouvirá nenhum som.
jeremyjjbrown

7

A maneira mais fácil que encontrei foi baixar o arquivo jar JLayer de http://www.javazoom.net/javalayer/sources.html e adicioná-lo à biblioteca Jar http://www.wikihow.com/Add-JARs- to-Project-Build-Paths-in-Eclipse-% 28Java% 29

Aqui está o código para a aula

public class SimplePlayer {

    public SimplePlayer(){

        try{

             FileInputStream fis = new FileInputStream("File location.");
             Player playMP3 = new Player(fis);

             playMP3.play();

        }  catch(Exception e){
             System.out.println(e);
           }
    } 
}

e aqui estão as importações

import javazoom.jl.player.*;
import java.io.FileInputStream;

1
Sim, confira este vídeo [ youtube.com/… ele passa por todas as funções como parar e pausar.
Vlad,

1
Acho que já deveria conter essas funções, uma vez que parecem bastante básicas. Enfim, encontrei outra solução com outra biblioteca, obrigado pela resposta :)
N3sh 10/10/2014

5

Para dar aos leitores outra alternativa, estou sugerindo a biblioteca JACo MP3 Player, um reprodutor de mp3 em plataforma cruzada.

Recursos:

  • uso de CPU muito baixo (~ 2%)
  • pequena biblioteca incrível (~ 90 KB)
  • não precisa de JMF (Java Media Framework)
  • fácil de integrar em qualquer aplicativo
  • fácil de integrar em qualquer página da web (como miniaplicativo).

Para uma lista completa de seus métodos e atributos, você pode verificar sua documentação aqui .

Código de amostra:

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

public class Example1 {
  public static void main(String[] args) {
    new MP3Player(new File("test.mp3")).play();
  }
}

Para obter mais detalhes, criei um tutorial simples aqui que inclui um código-fonte para download.


WOW, isso foi incrivelmente simples.
Wesos de Queso

o download do código-fonte não fornece o código-fonte real para a biblioteca?
a8_

4

Usando o decodificador / reprodutor / conversor de MP3 Dependência do Maven.

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class PlayAudio{

public static void main(String[] args) throws FileNotFoundException {

    try {
        FileInputStream fileInputStream = new FileInputStream("mp.mp3");
        Player player = new Player((fileInputStream));
        player.play();
        System.out.println("Song is playing");
        while(true){
            System.out.println(player.getPosition());
        }
    }catch (Exception e){
        System.out.println(e);
    }

  }

}

2

Você precisa instalar o JMF primeiro (faça download usando este link )

File f = new File("D:/Songs/preview.mp3");
MediaLocator ml = new MediaLocator(f.toURL());
Player p = Manager.createPlayer(ml);
p.start();

não se esqueça de adicionar arquivos JMF jar


5
Observe que o JMF foi abandonado pela Sun / Oracle há muito tempo.
Hendrik

1

Faça uma pesquisa em freshmeat.net para JAVE (significa Java Audio Video Encoder) Library (link aqui ). É uma biblioteca para esse tipo de coisa. Não sei se o Java tem uma função mp3 nativa.

Provavelmente, você precisará agrupar a função mp3 e a função wav, usando herança e uma função wrapper simples, se quiser um método para executar os dois tipos de arquivos.


Eu realmente não tenho ideia de como usar bibliotecas personalizadas, alguma ajuda com isso?
Stan

Baixe a biblioteca e escreva uma instrução de inclusão em seu código. Deve haver instruções sobre o uso da biblioteca incluídas. Normalmente, uma chamada de função é suficiente, embora você possa precisar declarar um objeto primeiro. Em seguida, crie uma função que verifique a extensão do arquivo de sua entrada e chame a função de biblioteca desejada.
Spencer Rathbun

0

Para adicionar suporte de leitura de MP3 ao Java Sound, adicione o mp3plugin.jardo JMF ao caminho de classe de tempo de execução do aplicativo.

Observe que a Clipclasse tem limitações de memória que a tornam inadequada para mais do que alguns segundos de som de alta qualidade.


2
O JMF foi abandonado em 2003. Não é recomendado que você o use.
joshreesjones

@ mathguy54 Quando recomendo às pessoas que não o usem, é porque não suporta diferentes tipos de mídia o suficiente. No entanto, ainda é totalmente adequado para decodificar MP3.
Andrew Thompson

0

Tenho outros métodos para isso, o primeiro é:

public static void playAudio(String filePath){

    try{
        InputStream mus = new FileInputStream(new File(filePath));
        AudioStream aud = new AudioStream(mus);
    }catch(Exception e){
        JOptionPane.showMessageDialig(null, "You have an Error");
    }

E a segunda é:

try{
    JFXPanel x = JFXPanel();
    String u = new File("021.mp3").toURI().toString();
    new MediaPlayer(new Media(u)).play();
} catch(Exception e){
    JOPtionPane.showMessageDialog(null, e);
}

E se quisermos fazer um loop neste áudio, usamos este método.

try{
    AudioData d = new AudioStream(new FileInputStream(filePath)).getData();
    ContinuousAudioDataStream s = new ContinuousAudioDataStream(d);
    AudioPlayer.player.start(s);
} catch(Exception ex){
    JOPtionPane.showMessageDialog(null, ex);
}

se quisermos parar este loop, adicionamos estas bibliotecas na tentativa:

AudioPlayer.player.stop(s);

para este terceiro método, adicionamos as seguintes importações:

import java.io.FileInputStream;
import sun.audio.AudioData;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;

-2

Use esta biblioteca: import sun.audio. *;

public void Sound(String Path){
    try{
        InputStream in = new FileInputStream(new File(Path));
        AudioStream audios = new AudioStream(in);
        AudioPlayer.player.start(audios);
    }
    catch(Exception e){}
}

2
Esta não tem sido a maneira correta de reproduzir sons por muito tempo. Consulte também É uma má prática usar classes Java proprietárias da Sun? Seu código com um bloco catch vazio também é um exemplo terrível.
Radiodef
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.