Воспроизведение .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 файлы одним и тем же методом.


person Stan    schedule 18.05.2011    source источник
comment
Похоже, вам понадобится какой-то плагин. В JMF должно быть то, что вам нужно. oracle.com/technetwork/java/javase/tech/ index-jsp-140239.html   -  person Otra    schedule 18.05.2011
comment
Что ж, я не знаю, как использовать эти штуки, я никогда ими раньше не пользовался. Как я могу это реализовать, как я могу это использовать?   -  person Stan    schedule 18.05.2011
comment
От JFM отказались в 2003 году. Не рекомендуется использовать его.   -  person joshreesjones    schedule 15.05.2014
comment
Стоит отметить, что в методе main необходимо добавить Thread.sleep, чтобы слышать звук, иначе программа завершится раньше, чем это произойдет. Полезный способ сделать это: Thread.sleep(clip.getMicrosecondLength() / 1000);   -  person André Willik Valenti    schedule 01.05.2015


Ответы (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 java.io.File;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
person jasonwaste    schedule 19.04.2012
comment
Это сработало для меня, но библиотеки были доступны только в проекте javafx в netbeans и использовали следующий код - person Neil; 14.07.2012
comment
конечный URL-адрес resource = getClass (). getResource (a.mp3); - person Neil; 14.07.2012
comment
Мне пришлось передать resource.toString() конструктору Media() - person Ali; 23.09.2012
comment
это вообще не работает для меня. там сказано, что импорта не существует. и я запускаю java 7 ... - person PulsePanda; 26.11.2012
comment
stackoverflow .com / questions / 15149547 / Похоже, вам нужно вручную добавить библиотеку javafx из папки Java 7, если вы используете Eclipse. - person Gyurme; 15.06.2013
comment
Технически Media и MediaPlayer - это не классы Java, а классы JavaFX. Чтобы добавить поддержку mp3 в Java в OS X или Windows, вы можете изучить SampledSP. И да - я написал эти библиотеки. - person Hendrik; 01.07.2013
comment
Не забывайте, что вам также нужно инициализировать javaFX, чтобы это работало. stackoverflow.com/questions/14025718/ - person WizardsOfWor; 26.02.2014
comment
Если вы не хотите полагаться на JavaFX, попробуйте вместо этого следующий ответ: stackoverflow.com/a/17737483/363573 - person Stephan; 30.04.2014
comment
Медиа m = новый Медиа (Paths.get (YourFileName.mp3) .toUri (). ToString ()); - person Amr Lotfy; 22.05.2015
comment
Чтобы импортировать библиотеки JavaFX в Eclipse (Luna): я использую следующую работу. Сначала перейдите в область Build Configurations, вкладку Libraries. Удалите JRE! Затем добавьте его обратно. По неизвестной причине после добавления библиотеки вручную система может найти библиотеки JavaFX обычным образом. Я не знаю, исправлена ​​ли эта ошибка в Mars или нет. - person Phil Freihofner; 12.11.2015
comment
@jasonwaste, это отлично работает, однако есть небольшая задержка до начала воспроизведения музыки. Есть ли способ обойти это? - person E Shindler; 19.02.2016
comment
Я пробовал это, и у меня нет ошибок, но звук не воспроизводится. Я не знаю, как это исправить и что делать. Не могли бы вы взглянуть на проблему здесь? - person Ryan; 28.07.2016
comment
Обратите внимание, что JavaFX поставляется вместе с Java 8+. Если вы хотите использовать MediaPlayer в JavaFX, ваше приложение также должно расширять javafx.application.Application, например public class MyClass extends Application. - person Benny Neugebauer; 04.02.2017
comment
У меня ошибка: конструктор Media (String) не определен. Почему? Я скачал javafx / javafx-ui-desktop.jar - person Koss; 21.05.2017
comment
Первоначально работает при нажатии первой кнопки (я создал приложение для набора номера на телефоне), но при втором нажатии на другую кнопку не работает. При повторном нажатии второй кнопки звук снова звучит. То же самое и с другими кнопками .. Иногда срабатывает, иногда нужен второй щелчок ??? Любые идеи? - person Marka A; 10.10.2017
comment
У меня есть требование воспроизвести медиафайл на определенном аудиоустройстве. java.audio поддерживает это, но я не видел способа сделать это с помощью MediaPlayer. - person Robbie Matthews; 02.07.2018
comment
MadiaPlayer может вызвать утечку памяти - person Tsyklop; 02.10.2018
comment
Я получаю jfxmedia.MediaException: Could not create player! ошибку. - person Pixel; 23.10.2020
comment
@Tsyklop Просто погуглил JavaFX MediaPlayer memory leak, и я получил этот SO-ответ. В нем говорится, что до JavaFX 8 MediaPlayer имела утечку памяти, но большинство людей, вероятно, больше не используют JavaFX 2.2. - person Tech Expert Wizard; 06.12.2020
comment
Теперь, когда JavaFX больше не входит в комплект JDK, я думаю, что использование JavaFX только для воспроизведения аудио в формате MP3 - не лучшая идея. Однако это не пустая трата времени, если вы также создаете графический интерфейс с помощью JavaFX. - person Tech Expert Wizard; 06.12.2020

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

person Thomas Mueller    schedule 31.05.2011
comment
Есть ли планы перенести проект на github? знак равно - person Ryu S.; 17.09.2019

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

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

Ссылки:

person oldo    schedule 19.07.2013
comment
Я получаю эту ошибку как для mp3, так и для ogg: UnsupportedAudioFileException: не удалось получить поток аудиовхода из входного файла - person David Winiecki; 04.06.2015
comment
Я поместил код в модуль Maven. Это определенно работает: search.maven.org/ < / а> - person oldo; 03.09.2015
comment
я мог бы обновить номера версий до: ‹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› - person tibi; 14.08.2016
comment
только последняя версия verbisspi 1.0.3.3 не работала. - person tibi; 14.08.2016
comment
Это здорово, работает с MP3 и WAV прямо из коробки! - person Miles Henrichs; 22.03.2020
comment
Использование Jdk12 (ОС: Windows 10), проект, отличный от maven, отлично работал с файлом WAV. Но не удалось для MP3 с исключением неподдерживаемого формата. - person RafiAlhamd; 20.10.2020
comment
@RafiAlhamd: убедитесь, что у вас есть все зависимости Maven в виде jar-файлов в вашем пути к классам. - person oldo; 22.10.2020
comment
А пока остановился на WAV. Пришлось использовать только стандартные библиотеки JDK. Сторонние библиотеки не разрешены. Не забудьте попробовать MP3, когда в этом возникнет необходимость. - person RafiAlhamd; 27.10.2020
comment
Я думаю, тебе не нужно vorbisspi, если ты еще не играешь в OGG. - person Tech Expert Wizard; 06.12.2020
comment
До сих пор я использовал и пробовал много библиотек. Многие из них устарели или заброшены и со временем сломались, с новыми форматами и т. Д. Это отличный пример, работал сразу же, библиотеки очень маленькие по сравнению с другими fameworks. Большое спасибо, отличный пост! - person JayC667; 10.06.2021

вы можете играть в .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

person Gustavo Marques    schedule 21.08.2012
comment
Это не правильно. Java будет воспроизводить другие форматы контейнеров, кроме wav. Кроме того, wav - это контейнерный формат, который может даже содержать mp3. Таким образом, Java не может воспроизводить все файлы WAV. - person Radiodef; 15.05.2015

Я давно не использовал его, но JavaLayer отлично подходит для воспроизведения MP3.

person Mark Heath    schedule 19.05.2011
comment
Да, это очень круто. Просто и не похоже на платформу. Прекрасно играет в фоновом режиме и просто нужно понять, как остановить поток. - person James P.; 11.08.2012

Я бы рекомендовал использовать 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.

person Ivo    schedule 10.03.2014
comment
Спасибо, это самый простой способ добавить поддержку mp3 в текущее приложение. Однако mp3spi1.9.4.jar следует заменить на mp3spi1.9.5.jar с сайта java zoom. - person Old Badman Grey; 29.07.2014
comment
Не забудьте засыпать основной поток после player.play(), иначе вы можете не услышать никакого звука. - person jeremyjjbrown; 28.12.2014

Самый простой способ, который я нашел, - это загрузить файл 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;
person Vlad    schedule 21.06.2014
comment
Да, посмотрите это видео [youtube.com/ it выполняет все функции, такие как остановка и пауза. - person Vlad; 10.10.2014
comment
Я думаю, что он уже должен содержать эти функции, поскольку они кажутся довольно простыми. В любом случае, я нашел другое решение с другой библиотекой, спасибо за ответ :) - person N3sh; 10.10.2014

Чтобы дать читателям другую альтернативу, я предлагаю библиотеку 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();
  }
}

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

person Mr. Xymon    schedule 04.03.2015
comment
Вау, это было невероятно просто. - person Wesos de Queso; 06.07.2017
comment
загрузка исходного кода не дает фактического исходного кода библиотеки? - person a8_; 16.04.2020

Использование MP3-декодера / проигрывателя / конвертера 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);
    }

  }

}
person niks    schedule 06.07.2019

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

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

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

person Kasun Shamentha    schedule 09.06.2012
comment
Обратите внимание, что Sun / Oracle давно отказались от JMF. - person Hendrik; 01.07.2013

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

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

person Spencer Rathbun    schedule 18.05.2011
comment
Я действительно понятия не имею, как использовать пользовательские библиотеки, помочь с этим? - person Stan; 20.05.2011
comment
Загрузите библиотеку и напишите в свой код оператор include. Должны быть включены инструкции по использованию библиотеки. Обычно достаточно вызова функции, хотя вам может потребоваться сначала объявить объект. Затем создайте функцию, которая проверяет расширение входного файла и вызывает нужную библиотечную функцию. - person Spencer Rathbun; 21.05.2011

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

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

person Andrew Thompson    schedule 19.05.2011
comment
От JMF отказались в 2003 году. Не рекомендуется использовать его. - person joshreesjones; 15.05.2014
comment
@ mathguy54 Когда я рекомендую людям не использовать его, это потому, что он не поддерживает достаточное количество различных типов носителей. Тем не менее, его вполне достаточно для декодирования MP3. - person Andrew Thompson; 15.05.2014

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

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;
person Fridjato Part Fridjat    schedule 11.12.2019

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

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.
    }

  }
}
person Jin Lim    schedule 07.02.2021

Используйте эту библиотеку: 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){}
}
person Akila Lekamge    schedule 24.04.2018
comment
Это был неправильный способ воспроизведения звука в течение очень долгого времени. См. Также Использование проприетарных классов Java Sun - плохая практика? Ваш код с пустым Блок catch также является ужасным примером. - person Radiodef; 15.07.2018