Chơi .mp3 và .wav trong Java?


105

Làm cách nào để phát một .mp3và một .wavtệp trong ứng dụng Java của tôi? Tôi đang sử dụng Swing. Tôi đã thử tìm kiếm trên internet, ví dụ như sau:

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

Tuy nhiên, điều này sẽ chỉ phát .wavcác tệp.

Tương tự với:

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

Tôi muốn có thể phát cả .mp3tệp và .wavtệp với cùng một phương pháp.


1
Có vẻ như bạn sẽ cần một số loại plugin. JMF nên có những gì bạn cần. oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
Otra

Chà, tôi không chắc làm thế nào để sử dụng những thứ này, tôi chưa bao giờ sử dụng chúng trước đây. Làm thế nào tôi có thể cấy ghép nó, làm thế nào tôi có thể sử dụng nó?
Stan

JFM đã bị bỏ rơi vào năm 2003. Bạn không nên sử dụng nó.
joshreesjones

3
Cần lưu ý rằng, trong một mainphương thức, cần phải thêm một Thread.sleepđể nghe âm thanh, nếu không chương trình sẽ kết thúc trước khi điều đó xảy ra. Một cách hữu ích để làm điều đó là:Thread.sleep(clip.getMicrosecondLength() / 1000);
André Valenti

Câu trả lời:


119

Java FX có MediaMediaPlayercác lớp sẽ phát các tệp mp3.

Mã ví dụ:

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

Bạn sẽ cần các câu lệnh nhập sau:

import java.io.File;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

5
tài nguyên URL cuối cùng = getClass (). getResource ("a.mp3");
Neil

44
điều này không làm việc cho tôi chút nào. nó nói rằng nhập khẩu không tồn tại. và tôi đang chạy java 7 ...
PulsePanda

9
stackoverflow.com/questions/15149547/… Có vẻ như bạn cần thêm thủ công thư viện javafx từ bên trong thư mục Java 7 nếu bạn sử dụng Eclipse.
Gyurme

7
Về mặt kỹ thuật, MediaMediaPlayerkhông phải là các lớp Java , mà là các lớp JavaFX . Để thêm hỗ trợ mp3 vào Java trên OS X hoặc Windows, bạn có thể muốn xem xét Sa SampleSP . Và vâng - tôi đã viết những thư viện đó.
Hendrik

8
Đừng quên rằng bạn cũng cần khởi tạo javaFX để nó hoạt động. stackoverflow.com/questions/14025718/…
user738048


18

bạn chỉ có thể chơi .wav với API java:

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

mã:

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

Và chơi .mp3 với jLayer


4
Cái này sai. Java sẽ chơi các định dạng vùng chứa khác ngoài wav. Hơn nữa, wav là một định dạng vùng chứa thậm chí có thể chứa mp3. Vì vậy, Java không thể phát tất cả các tệp wav.
Radiodef

15

Đã lâu tôi chưa sử dụng nó, nhưng JavaLayer rất tuyệt để phát lại MP3


Vâng, nó rất tuyệt. Đơn giản và không có vẻ phụ thuộc vào nền tảng. Phát tốt trong nền và chỉ cần tìm ra cách dừng một chuỗi.
James P.

14

Sử dụng API javax.sound tiêu chuẩn, một phụ thuộc Maven duy nhất, hoàn toàn là Mã nguồn mở ( yêu cầu 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);
        }
    }
}

Người giới thiệu:


Tôi nhận được lỗi này cho cả mp3 và ogg: UnsupportedAudioFileException: không thể có được dòng đầu vào âm thanh từ tập tin đầu vào
David Winiecki

Tôi đặt mã vào một mô-đun Maven. Nó chắc chắn hoạt động: search.maven.org/...
odoepner

tôi có thể nâng cấp số phiên bản lên: <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

chỉ verbisspi 1.0.3.3 mới nhất không hoạt động.
tibi

Điều này thật tuyệt vời, nó hoạt động với MP3 và WAV ngay lập tức!
Miles Henrichs

13

Tôi khuyên bạn nên sử dụng BasicPlayerAPI. Nó là mã nguồn mở, rất đơn giản và không yêu cầu JavaFX. http://www.javazoom.net/jlgui/api.html

Sau khi tải xuống và giải nén tệp zip, người ta nên thêm các tệp jar sau vào đường dẫn xây dựng của dự án:

  • basicplayer3.0.jar
  • tất cả các lọ từ thư mục lib (bên trong BasicPlayer3.0)

Đây là một ví dụ sử dụng tối giản:

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

Nhập khẩu bắt buộc:

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

Đó là tất cả những gì bạn cần để bắt đầu chơi nhạc. Người chơi đang bắt đầu và quản lý chuỗi phát lại của riêng mình và cung cấp chức năng phát, tạm dừng, tiếp tục, dừngtìm kiếm .

Để sử dụng nâng cao hơn, bạn có thể xem qua Trình phát nhạc jlGui. Đó là một bản sao WinAmp mã nguồn mở: http://www.javazoom.net/jlgui/jlgui.html

Lớp đầu tiên cần xem sẽ là PlayerUI (bên trong gói javazoom.jlgui.player.amp). Nó thể hiện khá tốt các tính năng nâng cao của BasicPlayer.


Cảm ơn, đây là cách dễ nhất mà tôi đã thử thêm hỗ trợ mp3 vào ứng dụng hiện tại. mp3spi1.9.4.jarnên được thay thế bằng mp3spi1.9.5.jartừ trang java zoom.
Old Badman Grey

Đừng quên ngủ chuỗi chính của bạn sau đó player.play()nếu không bạn có thể không nghe thấy bất kỳ âm thanh nào.
jeremyjjbrown

7

Cách dễ nhất mà tôi tìm thấy là tải xuống tệp jar JLayer từ http://www.javazoom.net/javalayer/sources.html và thêm nó vào thư viện Jar http://www.wikihow.com/Add-JARs- to-Project-Build-Paths-in-Eclipse-% 28Java% 29

Đây là mã cho lớp học

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

và đây là hàng nhập khẩu

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

1
Có, nó không kiểm tra video này [ youtube.com/… nó đi qua tất cả các chức năng như dừng và tạm dừng.
Vlad

1
Tôi nghĩ rằng nó nên đã chứa những chức năng đó, vì chúng có vẻ khá cơ bản. Dù sao, tôi tìm thấy một giải pháp với một thư viện, nhờ trả lời :)
N3sh

5

Để cung cấp cho độc giả một giải pháp thay thế khác, tôi đề xuất thư viện JACo MP3 Player, một trình phát mp3 java đa nền tảng.

Đặc trưng:

  • sử dụng CPU rất thấp (~ 2%)
  • thư viện nhỏ đáng kinh ngạc (~ 90KB)
  • không cần JMF (Java Media Framework)
  • dễ dàng tích hợp trong bất kỳ ứng dụng nào
  • dễ dàng tích hợp vào bất kỳ trang web nào (dưới dạng applet).

Để có danh sách đầy đủ các phương thức và thuộc tính của nó, bạn có thể xem tài liệu của nó tại đây .

Mã mẫu:

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

Để biết thêm chi tiết, tôi đã tạo một hướng dẫn đơn giản ở đây bao gồm mã nguồn có thể tải xuống.


WOW, điều đó thật đơn giản.
Wesos de Queso

tải xuống mã nguồn không cung cấp mã nguồn thực tế cho thư viện?
a8_

4

Sử dụng Bộ giải mã / trình phát / chuyển đổi 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);
    }

  }

}

2

Bạn cần cài đặt JMF trước ( tải xuống bằng liên kết này )

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

đừng quên thêm các tệp jar JMF


5
Lưu ý rằng JMF đã bị Sun / Oracle bỏ rơi từ lâu.
Hendrik

1

Thực hiện tìm kiếm trên Freshmeat.net cho Thư viện JAVE (viết tắt của Java Audio Video Encoder) (liên kết tại đây ). Đó là một thư viện cho những thứ này. Tôi không biết liệu Java có chức năng mp3 gốc hay không.

Có thể bạn sẽ cần kết hợp hàm mp3 và hàm wav, sử dụng tính năng kế thừa và một hàm trình bao bọc đơn giản, nếu bạn muốn một phương thức để chạy cả hai loại tệp.


Tôi thực sự không biết làm thế nào để sử dụng thư viện tùy chỉnh, bất kỳ trợ giúp nào với nó?
Stan

Tải xuống thư viện và viết câu lệnh bao gồm trong mã của bạn. Cần có hướng dẫn sử dụng thư viện. Thông thường, một cuộc gọi hàm là đủ, mặc dù bạn có thể cần phải khai báo một đối tượng trước. Sau đó, tạo một hàm kiểm tra phần mở rộng tệp của đầu vào và gọi hàm thư viện bạn muốn.
Spencer Rathbun

0

Để thêm hỗ trợ đọc MP3 cho Java Sound, hãy thêm mp3plugin.jarJMF vào đường dẫn lớp thời gian chạy của ứng dụng.

Lưu ý rằng Cliplớp có giới hạn về bộ nhớ khiến nó không phù hợp với âm thanh chất lượng cao hơn một vài giây.


2
JMF đã bị bỏ rơi vào năm 2003. Bạn không nên sử dụng nó.
joshreesjones

@ mathguy54 Khi tôi khuyên mọi người không nên sử dụng nó, đó là vì nó không hỗ trợ đủ các loại phương tiện khác nhau. Tuy nhiên, nó vẫn hoàn toàn phù hợp để giải mã MP3.
Andrew Thompson

0

Tôi có các phương pháp khác cho điều đó, phương pháp đầu tiên là:

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

Và thứ hai là:

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

Và nếu chúng ta muốn lặp lại âm thanh này, chúng ta sử dụng phương pháp này.

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

nếu chúng tôi muốn dừng vòng lặp này, chúng tôi thêm các ký tự viết tắt này trong lần thử:

AudioPlayer.player.stop(s);

đối với phương pháp thứ ba này, chúng tôi thêm các nhập sau đây:

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

-2

Sử dụng thư viện này: 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
Đây không phải là cách chính xác để phát âm thanh trong một thời gian dài. Xem thêm Sử dụng các lớp Java độc quyền của Sun có phải là một thực tiễn tồi? Mã của bạn với một khối bắt trống cũng là một ví dụ khủng khiếp.
Radiodef
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.