Воспроизведение .mp3 и .wav на Java?


105

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


1
Похоже, вам понадобится какой-то плагин. В JMF должно быть то, что вам нужно. oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
Отра

Что ж, я не знаю, как использовать эти штуки, я никогда ими раньше не пользовался. Как я могу это реализовать, как я могу это использовать?
Стэн

От JFM отказались в 2003 году. Не рекомендуется использовать его.
joshreesjones

3
Стоит отметить, что в mainметоде необходимо добавить Thread.sleep, чтобы слышать звук, иначе программа завершится раньше, чем это произойдет. Полезный способ сделать это:Thread.sleep(clip.getMicrosecondLength() / 1000);
Андре Валенти

Ответы:


119

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;

5
конечный URL-адрес resource = getClass (). getResource ("a.mp3");
Нил

44
это вообще не работает для меня. там сказано, что импорта не существует. и я использую java 7 ...
PulsePanda,

9
stackoverflow.com/questions/15149547/… Похоже, вам нужно вручную добавить библиотеку javafx из папки Java 7, если вы используете Eclipse.
Gyurme

7
С технической точки зрения Mediaи MediaPlayerне являются Java - классы, но JavaFX классы. Чтобы добавить поддержку mp3 в Java в OS X или Windows, вы можете изучить SampledSP . И да - я написал эти библиотеки.
Hendrik

8
Не забывайте, что вам также необходимо инициализировать javaFX, чтобы это работало. stackoverflow.com/questions/14025718/…
user738048


18

вы можете воспроизводить .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


4
Это не верно. Java будет воспроизводить другие форматы контейнеров, кроме wav. Кроме того, wav - это контейнерный формат, который может даже содержать mp3. Таким образом, Java не может воспроизводить все файлы wav.
Radiodef

15

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


Да, очень круто. Просто и не похоже на платформу. Прекрасно играет в фоновом режиме и просто нужно понять, как остановить поток.
Джеймс П.

14

Используя стандартный 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);
        }
    }
}

Ссылки:


Я получаю эту ошибку как для mp3, так и для ogg: UnsupportedAudioFileException: не удалось получить поток аудиовхода из входного файла
Дэвид Винецки

Я поместил код в модуль Maven. Это определенно работает: search.maven.org/…
odoepner 03

я мог бы обновить номера версий до: <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

только последняя версия verbisspi 1.0.3.3 не работала.
tibi

Это здорово, работает с MP3 и WAV прямо из коробки!
Майлз Хенрихс,

13

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


Спасибо, это самый простой способ добавить поддержку mp3 в текущее приложение. mp3spi1.9.4.jarследует заменить на с mp3spi1.9.5.jarсайта увеличения java.
Old Badman Grey

Не забудьте после этого засыпать основной поток, player.play()иначе вы можете не услышать никакого звука.
jeremyjjbrown

7

Самый простой способ, который я нашел, - это загрузить файл 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;

1
Да, посмотрите это видео [ youtube.com/… в нем используются все функции, такие как остановка и пауза.
Влад

1
Я думаю, что он уже должен содержать эти функции, поскольку они кажутся довольно простыми. В любом случае, я нашел другое решение с другой библиотекой, спасибо за ответ :)
N3sh

5

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

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


Вау, это было невероятно просто.
Wesos de Queso

загрузка исходного кода не дает фактического исходного кода библиотеки?
a8_

4

Использование 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);
    }

  }

}

2

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

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

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


5
Обратите внимание, что Sun / Oracle давно отказались от JMF.
Hendrik

1

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

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


Я действительно понятия не имею, как использовать пользовательские библиотеки, какая-нибудь помощь с этим?
Стэн

Загрузите библиотеку и напишите в свой код оператор include. Должны быть включены инструкции по использованию библиотеки. Обычно достаточно вызова функции, хотя вам может потребоваться сначала объявить объект. Затем создайте функцию, которая проверяет расширение файла своего ввода и вызывает нужную библиотечную функцию.
Спенсер Ратбун,

0

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

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


2
От JMF отказались в 2003 году. Не рекомендуется использовать его.
Джошрисджонс

@ mathguy54 Когда я рекомендую людям не использовать его, это потому, что он не поддерживает достаточное количество различных типов носителей. Тем не менее, для декодирования MP3 этого вполне достаточно.
Эндрю Томпсон

0

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

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;

-2

Используйте эту библиотеку: 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
Это был неправильный способ воспроизведения звука очень давно. См. Также. Использование закрытых Java-классов Sun - плохая практика? Ваш код с пустым блоком catch также является ужасным примером.
Radiodef
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.