เล่น. 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
Otra

ฉันไม่แน่ใจว่าจะใช้สิ่งเหล่านี้อย่างไรฉันไม่เคยใช้มาก่อน ฉันจะใช้มันได้อย่างไรฉันจะใช้มันได้อย่างไร?
สแตน

JFM ถูกละทิ้งในปี 2546 ไม่แนะนำให้คุณใช้
joshreesjones

3
เป็นที่น่าสังเกตว่าในmainวิธีการหนึ่งจำเป็นต้องเพิ่มThread.sleepเพื่อที่จะได้ยินเสียงมิฉะนั้นโปรแกรมจะสิ้นสุดก่อนที่จะเกิดขึ้น วิธีที่มีประโยชน์คือ:Thread.sleep(clip.getMicrosecondLength() / 1000);
André Valenti

คำตอบ:


120

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
Gyurme

7
เทคนิคMediaและMediaPlayerไม่ได้Javaเรียน แต่JavaFXชั้นเรียน เพื่อเพิ่มการสนับสนุน MP3 เพื่อ Java บน OS X หรือ Windows คุณอาจต้องการที่จะมองเข้าไปในSampledSP และใช่ - ฉันเขียนห้องสมุดเหล่านั้น
Hendrik

8
อย่าลืมว่าคุณต้องเริ่มต้น javaFX ด้วยเพื่อให้สามารถใช้งานได้ stackoverflow.com/questions/14025718/…
user738048

30

ผมเขียนบริสุทธิ์เครื่องเล่น mp3 Java: mp3transform


1
มีแผนจะผลักดันโครงการไปยัง github หรือไม่? =)
Ryu S.

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


ใช่มันเจ๋งมาก เรียบง่ายและดูเหมือนไม่ขึ้นกับแพลตฟอร์ม เล่นเป็นพื้นหลังได้ดีและเพียงแค่ต้องหาวิธีหยุดเธรด
James P.

14

การใช้ javax.sound มาตรฐาน API การพึ่งพา 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: ไม่สามารถรับสตรีมอินพุตเสียงจากไฟล์อินพุต
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 ทันที!
Miles Henrichs

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จากไซต์ซูมจาวา
Old Badman Grey

อย่าลืมนอนด้ายหลักของคุณหลังจากนั้นมิplayer.play()ฉะนั้นคุณอาจไม่ได้ยินเสียงใด ๆ
jeremyjjbrown

7

วิธีที่ง่ายที่สุดที่ฉันพบคือดาวน์โหลดไฟล์ JLayer jar จากhttp://www.javazoom.net/javalayer/sources.htmlและเพิ่มลงในคลัง Jar http://www.wikihow.com/Add-JARs- ไปยังโครงการสร้างเส้นทางใน 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/…มันผ่านฟังก์ชั่นทั้งหมดเช่นหยุดและหยุดชั่วคราว
Vlad

1
ฉันคิดว่ามันควรจะมีฟังก์ชั่นเหล่านั้นอยู่แล้วเพราะมันดูค่อนข้างธรรมดา อย่างไรก็ตามฉันพบวิธีแก้ปัญหาอื่นกับห้องสมุดอื่นขอบคุณสำหรับการตอบกลับ :)
N3sh

5

เพื่อให้ผู้อ่านมีทางเลือกอื่นฉันขอแนะนำ JACo MP3 Player library ซึ่งเป็นเครื่องเล่น java mp3 แบบข้ามแพลตฟอร์ม

คุณสมบัติ:

  • การใช้งาน CPU ต่ำมาก (~ 2%)
  • ห้องสมุดขนาดเล็กที่น่าทึ่ง (~ 90KB)
  • ไม่จำเป็นต้องใช้ 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 / เครื่องเล่น / ตัวแปลง 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) Library (ลิงค์ที่นี่ ) มันเป็นห้องสมุดสำหรับสิ่งเหล่านี้ ฉันไม่รู้ว่า Java มีฟังก์ชัน mp3 ดั้งเดิมหรือไม่

คุณอาจจะต้องรวมฟังก์ชัน mp3 และฟังก์ชัน wav เข้าด้วยกันโดยใช้การสืบทอดและฟังก์ชัน wrapper แบบง่ายหากคุณต้องการวิธีการหนึ่งในการเรียกใช้ไฟล์ทั้งสองประเภท


ฉันไม่รู้ว่าจะใช้ไลบรารีแบบกำหนดเองได้อย่างไรมีความช่วยเหลืออย่างไร
สแตน

ดาวน์โหลดไลบรารีและเขียนคำสั่ง include ในโค้ดของคุณ ควรมีคำแนะนำในการใช้ห้องสมุดรวมอยู่ด้วย โดยปกติแล้วการเรียกใช้ฟังก์ชันจะเพียงพอแม้ว่าคุณอาจต้องประกาศวัตถุก่อน จากนั้นสร้างฟังก์ชันที่ตรวจสอบนามสกุลไฟล์ของอินพุตและเรียกใช้ฟังก์ชันไลบรารีที่คุณต้องการ
Spencer Rathbun

0

ในการเพิ่มการรองรับการอ่าน MP3 ไปยัง Java Sound ให้เพิ่มmp3plugin.jarJMF ลงในพา ธ คลาสรันไทม์ของแอ็พพลิเคชัน

โปรดทราบว่าClipคลาสนี้มีข้อ จำกัด ของหน่วยความจำที่ทำให้ไม่เหมาะสำหรับเสียงคุณภาพสูงนานกว่าสองสามวินาที


2
JMF ถูกทิ้งในปี 2546 ไม่แนะนำให้คุณใช้
joshreesjones

@ mathguy54 เมื่อฉันแนะนำให้คนไม่ใช้มันเป็นเพราะมันไม่รองรับสื่อประเภทต่างๆมากพอ อย่างไรก็ตามก็ยังเพียงพอสำหรับการถอดรหัส MP3
Andrew Thompson

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

หากเราต้องการหยุดการวนซ้ำเราเพิ่ม libreries นี้ในการลอง:

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 เป็นการปฏิบัติที่ไม่ดีหรือไม่? โค้ดของคุณที่มีบล็อกจับว่างก็เป็นตัวอย่างที่น่ากลัวเช่นกัน
Radiodef
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.