Відтворення .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 = getClass (). getResource ("a.mp3");
Ніл

44
це зовсім не працює для мене. там сказано, що імпорту не існує. і я біжу Java 7 ...
PulsePanda

9
stackoverflow.com/questions/15149547/… Схоже, вам потрібно вручну додати бібліотеку javafx із внутрішньої папки Java 7, якщо ви використовуєте Eclipse.
Гюрме

7
З технічної точки зору Mediaі MediaPlayerне є Java - класи, але JavaFX класи. Щоб додати підтримку mp3 в Java на OS X або Windows, можливо, захочете заглянути в SampledSP . І так - я написав ці бібліотеки.
Хендрік

8
Не забувайте, що вам також потрібно ініціалізувати javaFX. stackoverflow.com/questions/14025718 / ...
user738048


18

Ви можете грати .wav лише за допомогою API Java:

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 ):

пом.хмл

 <!-- 
    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: не вдалося отримати потік аудіо вхідного файлу
David Winiecki

Я поклав код у модуль Maven. Це безумовно працює: search.maven.org/…
odoepner

я міг би оновити номери версій до: <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.
Старий Бадман Грей

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

7

Найпростіший спосіб, який я знайшов, - це завантажити файл JLayer jar з http://www.javazoom.net/javalayer/sources.html і додати його до бібліотеки Jar http://www.wikihow.com/Add-JARs- проектувати-будувати-шляхи-в-затемнення-% 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

Щоб надати читачам ще одну альтернативу, я пропоную бібліотеку MP3-плеєрів JACo MP3, плеєр mp3-плеєра java.

Особливості:

  • дуже низьке використання процесора (~ 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();
  }
}

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


WOW, це було неймовірно просто.
Wesos de Queso

завантаження вихідного коду не дає фактичного вихідного коду бібліотеці?
a8_

4

Використання 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);
    }

  }

}


1

Зробіть пошук freshmeat.net для бібліотеки JAVE (розшифровується як Java Audio Video Encoder) Бібліотека (посилання тут ). Це бібліотека для подібних речей. Я не знаю, чи є у Java функція mp3.

Ймовірно, вам потрібно буде з'єднати mp3-функцію та функцію wav разом, використовуючи успадкування та просту функцію обгортки, якщо ви хочете одним методом запустити обидва типи файлів.


Я справді не маю уявлення, як користуватися власною бібліотекою, будь-яку допомогу з цим?
Стен

Завантажте бібліотеку і напишіть у свій код заяву про включення. Повинні бути інструкції щодо використання бібліотеки. Зазвичай виклику функції достатньо, хоча вам може знадобитися спочатку оголосити об'єкт. Потім створіть функцію, яка перевіряє розширення файлу на вхід і викликає потрібну функцію бібліотеки.
Спенсер Ратбун

0

Щоб додати підтримку зчитування MP3 в Java Sound, додайте mp3plugin.jarJMF до курсу класу часу роботи програми.

Зауважте, що у Clipкласу є обмеження в пам'яті, які роблять його непридатним протягом більш ніж декількох секунд звуку високої якості.


2
JMF було припинено в 2003 році. Не рекомендується використовувати його.
joshreesjones

@ 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

Використовуйте цю бібліотеку: імпортуйте 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? Ваш код із порожнім блоком лову також є жахливим прикладом.
Radiodef
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.