Играя.mp3 и.wav в Java?

Как я могу сыграть .mp3 и .wav файл в моем приложении Java? Я использую Swing. Я попытался поискать в Интернете что-то вроде этого примера:

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();
    }
}

Но это будет играть только .wav файлы.

То же самое с:

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

Я хочу иметь возможность играть как .mp3 файлы и .wav файлы с тем же методом.

15 ответов

Решение

Java FX имеет Media а также MediaPlayer классы, которые будут воспроизводить mp3 файлы.

Пример кода:

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

Вам понадобятся следующие операторы импорта:

import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

Я написал чистый mp3-плеер java: mp3transform.

Используя стандартный API javax.sound, единственную зависимость Maven, полностью с открытым исходным кодом (требуетсяJava 7):

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>

Код

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);
        }
    }
}

Рекомендации:

Вы можете играть в.wav только с Java API:

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

код:

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

И играть.mp3 с jLayer

Прошло много времени с тех пор, как я его использовал, но JavaLayer отлично подходит для воспроизведения MP3

Я бы порекомендовал использовать BasicPlayerAPI. Это открытый исходный код, очень простой и не требует JavaFX. http://www.javazoom.net/jlgui/api.html

После загрузки и распаковки zip-файла необходимо добавить следующие jar-файлы в путь сборки проекта:

  • basicplayer3.0.jar
  • все банки из каталога lib (внутри BasicPlayer3.0)

Вот минималистичный пример использования:

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();
}

Требуемый импорт:

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

Это все, что вам нужно, чтобы начать играть музыку. Проигрыватель запускает и управляет собственным потоком воспроизведения и предоставляет функции воспроизведения, паузы, возобновления, остановки и поиска.

Для более продвинутого использования вы можете взглянуть на jlGui Music Player. Это клон WinAmp с открытым исходным кодом: http://www.javazoom.net/jlgui/jlgui.html

Первым классом, на который стоит обратить внимание, будет PlayerUI (внутри пакета javazoom.jlgui.player.amp). Это демонстрирует расширенные возможности BasicPlayer довольно хорошо.

Чтобы предложить читателям другую альтернативу, я предлагаю библиотеку JACo MP3 Player, кроссплатформенный java mp3-плеер.

Особенности:

  • очень низкая загрузка процессора (~2%)
  • невероятно маленькая библиотека (~90 КБ)
  • не нуждается в JMF (Java Media Framework)
  • легко интегрируется в любое приложение
  • легко интегрируется в любую веб-страницу (как апплет).

Для полного списка его методов и атрибутов вы можете проверить его документацию здесь.

Образец кода:

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();
  }
}

Для более подробной информации я создал простое руководство, которое включает в себя загружаемый исходный код.

Самый простой способ, который я нашел, - это загрузить файл jar JLayer с http://www.javazoom.net/javalayer/sources.html и добавить его в библиотеку Jar http://www.wikihow.com/Add-JARs-to-Project-Build-Paths-in-Eclipse-%28Java%29

Вот код для класса

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);
           }
    } 
}

и вот импорт

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

Использование MP3 Decoder / player / converter Maven Dependency.

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);
    }

  }

}

Сначала необходимо установить JMF ( скачать по этой ссылке)

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

не забудьте добавить JAR-файлы JMF

Выполните поиск в freshmeat.net для библиотеки JAVE (расшифровывается как Java Audio Video Encoder) (ссылка здесь). Это библиотека для таких вещей. Я не знаю, есть ли в Java встроенная функция mp3.

Возможно, вам понадобится обернуть функции mp3 и wav вместе, используя наследование и простую функцию-обертку, если вы хотите, чтобы один метод запускал оба типа файлов.

Ничего не получилось. но этот отлично 👌

Google и сначала загрузите библиотеку Jlayer.

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

public class MusicPlay {

  public static void main(String[] args)  {

    try{

      FileInputStream fs = new FileInputStream("audio_file_path.mp3");
      Player player = new Player(fs);
      player.play();

    } catch (Exception e){
      // catch exceptions.
    }

  }
}

Чтобы добавить поддержку чтения MP3 в Java Sound, добавьте mp3plugin.jar JMF к пути класса приложения во время выполнения.

Обратите внимание, что Clip Класс имеет ограничения памяти, которые делают его непригодным для более чем нескольких секунд высококачественного звука.

У меня есть другие методы для этого, первый из них:

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");
    }

А второй:

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);
}

И если мы хотим сделать цикл для этого аудио, мы используем этот метод.

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);
}

если мы хотим остановить этот цикл, мы добавляем эти библиотеки в попытку:

AudioPlayer.player.stop(s);

для этого третьего метода мы добавляем следующий импорт:

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

Используйте эту библиотеку: 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){}
}
Другие вопросы по тегам