Memutar .mp3 dan .wav di Java?

105

Bagaimana saya bisa memainkan .mp3dan .wavfile dalam aplikasi Java saya? Saya menggunakan Swing. Saya mencoba mencari di internet, untuk sesuatu seperti contoh ini:

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

Tapi, ini hanya akan memutar .wavfile.

Sama halnya dengan:

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

Saya ingin dapat memutar .mp3file dan .wavfile dengan metode yang sama.

Stan
sumber
1
Sepertinya Anda memerlukan beberapa jenis plugin. JMF harus memiliki apa yang Anda butuhkan. oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
Otra
Yah, saya tidak yakin bagaimana menggunakan hal-hal ini, saya belum pernah menggunakannya sebelumnya. Bagaimana saya bisa menanamkannya, bagaimana saya bisa menggunakannya?
Stan
JFM ditinggalkan pada tahun 2003. Anda tidak disarankan untuk menggunakannya.
joshreesjones
3
Perlu dicatat bahwa, dalam suatu mainmetode, perlu menambahkan a Thread.sleepuntuk mendengar suaranya, atau program akan berakhir sebelum itu terjadi. Cara yang berguna untuk melakukannya adalah:Thread.sleep(clip.getMicrosecondLength() / 1000);
André Valenti

Jawaban:

119

Java FX memiliki Mediadan MediaPlayerkelas yang akan memutar file mp3.

Kode contoh:

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

Anda akan membutuhkan pernyataan import berikut:

import java.io.File;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
jasonwaste
sumber
5
URL final resource = getClass (). getResource ("a.mp3");
Neil
44
ini sama sekali tidak berhasil untukku. dikatakan bahwa impor tidak ada. dan saya menjalankan java 7 ...
PulsePanda
9
stackoverflow.com/questions/15149547/… Sepertinya Anda perlu menambahkan pustaka javafx secara manual dari dalam folder Java 7 jika Anda menggunakan Eclipse.
Gyurme
7
Secara teknis, Mediadan MediaPlayerbukan kelas Java , tetapi kelas JavaFX . Untuk menambahkan dukungan mp3 ke Java di OS X atau Windows, Anda mungkin ingin melihat SampledSP . Dan ya - saya menulis perpustakaan itu.
Hendrik
8
Jangan lupa Anda juga perlu menginisialisasi javaFX agar ini berfungsi. stackoverflow.com/questions/14025718/…
pengguna738048
30

Saya menulis mp3 player java murni: mp3transform .

Thomas Mueller
sumber
1
Ada rencana untuk mendorong proyek ke github? =)
Ryu S.
18

Anda dapat memainkan .wav hanya dengan java API:

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

kode:

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

Dan putar .mp3 dengan jLayer

Gustavo Marques
sumber
4
Ini salah. Java akan memainkan format kontainer lain selain wav. Lebih jauh, wav adalah format kontainer yang bahkan dapat berisi mp3. Jadi Java tidak bisa memainkan semua file wav.
Radiodef
15

Sudah lama saya tidak menggunakannya, tetapi JavaLayer sangat bagus untuk pemutaran MP3

Mark Heath
sumber
Ya, itu sangat keren. Sederhana dan sepertinya tidak bergantung pada platform. Dimainkan dengan baik di latar belakang dan hanya perlu memikirkan cara menghentikan utas.
James P.
14

Menggunakan API javax.sound standar, satu dependensi Maven, sepenuhnya Open Source ( diperlukan 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>

Kode

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

Referensi:

odoepner
sumber
Saya mendapatkan kesalahan ini untuk mp3 dan ogg: UnsupportedAudioFileException: tidak bisa mendapatkan aliran input audio dari file input
David Winiecki
Saya memasukkan kode tersebut ke dalam modul Maven. Ini pasti berhasil: search.maven.org/…
odoepner
saya dapat meningkatkan nomor versi ke: <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
hanya verbisspi 1.0.3.3 yang terbaru tidak berfungsi.
tibi
Ini hebat, ini berfungsi untuk MP3 dan WAV langsung dari kotak!
Miles Henrichs
13

Saya akan merekomendasikan menggunakan BasicPlayerAPI. Ini open source, sangat sederhana dan tidak memerlukan JavaFX. http://www.javazoom.net/jlgui/api.html

Setelah mengunduh dan mengekstrak file zip, seseorang harus menambahkan file jar berikut ke jalur build proyek:

  • basicplayer3.0.jar
  • semua toples dari direktori lib (di dalam BasicPlayer3.0)

Berikut adalah contoh penggunaan minimalis:

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

Impor yang dibutuhkan:

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

Hanya itu yang Anda butuhkan untuk mulai memutar musik. Pemain memulai dan mengelola utas pemutarannya sendiri dan menyediakan fungsionalitas putar, jeda, lanjutkan, hentikan, dan cari .

Untuk penggunaan lebih lanjut, Anda dapat melihat di jlGui Music Player. Ini adalah tiruan WinAmp open source: http://www.javazoom.net/jlgui/jlgui.html

Kelas pertama yang harus dilihat adalah PlayerUI (di dalam paket javazoom.jlgui.player.amp). Ini menunjukkan fitur-fitur lanjutan dari BasicPlayer dengan cukup baik.

Ivo
sumber
Terima kasih, ini adalah cara termudah saya mencoba menambahkan dukungan mp3 ke aplikasi saat ini. mp3spi1.9.4.jarharus diganti dengan mp3spi1.9.5.jardari situs zoom java sekalipun.
Old Badman Grey
Jangan lupa tidur utas utama Anda setelahnya player.play()atau Anda mungkin tidak mendengar suara apa pun.
jeremyjjbrown
7

Cara termudah yang saya temukan adalah mengunduh file jar JLayer dari http://www.javazoom.net/javalayer/sources.html dan menambahkannya ke perpustakaan Jar http://www.wikihow.com/Add-JARs- ke-Proyek-Build-Paths-in-Eclipse-% 28Java% 29

Ini kode untuk kelasnya

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

dan ini impornya

import javazoom.jl.player.*;
import java.io.FileInputStream;
Vlad
sumber
1
Ya, itu memeriksa video ini [ youtube.com/… itu melalui semua fungsi seperti berhenti dan jeda.
Vlad
1
Saya pikir itu seharusnya sudah berisi fungsi-fungsi itu, karena kelihatannya agak mendasar. Bagaimanapun, saya menemukan solusi lain dengan perpustakaan lain, terima kasih atas jawabannya :)
N3sh
5

Untuk memberikan alternatif lain kepada pembaca, saya menyarankan perpustakaan JACo MP3 Player, pemutar mp3 java lintas platform.

Fitur:

  • penggunaan CPU yang sangat rendah (~ 2%)
  • perpustakaan kecil yang luar biasa (~ 90KB)
  • tidak membutuhkan JMF (Java Media Framework)
  • mudah diintegrasikan dalam aplikasi apa pun
  • mudah diintegrasikan di halaman web mana pun (sebagai applet).

Untuk daftar lengkap metode dan atributnya, Anda dapat memeriksa dokumentasinya di sini .

Kode sampel:

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

Untuk lebih jelasnya, saya membuat tutorial sederhana di sini yang menyertakan kode sumber yang dapat diunduh.

Tuan Xymon
sumber
WOW, itu sangat sederhana.
Wesos de Queso
download kode sumber tidak memberikan kode sumber sebenarnya ke perpustakaan?
a8_
4

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

  }

}
niks
sumber
2

Anda perlu menginstal JMF terlebih dahulu ( unduh menggunakan tautan ini )

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

jangan lupa untuk menambahkan file jar JMF

Kasun Shamentha
sumber
5
Perhatikan bahwa JMF sudah lama ditinggalkan oleh Sun / Oracle.
Hendrik
1

Lakukan pencarian di freshmeat.net untuk JAVE (singkatan dari Java Audio Video Encoder) Library (tautan di sini ). Ini adalah perpustakaan untuk hal-hal semacam ini. Saya tidak tahu apakah Java memiliki fungsi mp3 asli.

Anda mungkin perlu menggabungkan fungsi mp3 dan fungsi wav, menggunakan pewarisan dan fungsi pembungkus sederhana, jika Anda ingin satu metode untuk menjalankan kedua jenis file.

Spencer Rathbun
sumber
Saya benar-benar tidak tahu cara menggunakan pustaka khusus, ada bantuan untuk itu?
Stan
Unduh perpustakaan dan tulis pernyataan termasuk dalam kode Anda. Harus ada instruksi tentang penggunaan perpustakaan disertakan. Biasanya, pemanggilan fungsi sudah cukup, meskipun Anda mungkin perlu mendeklarasikan sebuah objek terlebih dahulu. Kemudian, buat fungsi yang memeriksa ekstensi file dari inputnya, dan memanggil fungsi perpustakaan yang Anda inginkan.
Spencer Rathbun
0

Untuk menambahkan dukungan membaca MP3 ke Java Sound, tambahkan mp3plugin.jarJMF ke jalur kelas run-time aplikasi.

Perhatikan bahwa Clipkelas memiliki batasan memori yang membuatnya tidak cocok untuk mendengarkan suara berkualitas tinggi selama lebih dari beberapa detik.

Andrew Thompson
sumber
2
JMF ditinggalkan pada tahun 2003. Anda tidak disarankan untuk menggunakannya.
joshreesjones
@ mathguy54 Ketika saya menganjurkan orang untuk tidak menggunakannya, itu karena tidak mendukung jenis media yang cukup berbeda. Namun demikian, itu masih sepenuhnya memadai untuk decoding MP3.
Andrew Thompson
0

Saya punya metode lain untuk itu, yang pertama adalah:

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

Dan yang kedua adalah:

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

Dan jika kita ingin membuat loop ke audio ini kita menggunakan metode ini.

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

jika kita ingin menghentikan loop ini kita menambahkan libreries ini dalam percobaan:

AudioPlayer.player.stop(s);

untuk metode ketiga ini kami menambahkan impor berikut:

import java.io.FileInputStream;
import sun.audio.AudioData;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;
Fridjato Bagian Fridjat
sumber
-2

Gunakan pustaka ini: 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){}
}
Akila Lekamge
sumber
2
Ini bukan cara yang benar untuk memainkan suara untuk waktu yang lama. Lihat juga Ini adalah praktik yang buruk untuk menggunakan kelas Java berpemilik Sun? Kode Anda dengan blok tangkap kosong juga merupakan contoh yang buruk.
Radiodef