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.