在Java中播放.mp3和.wav?


105

如何在Java应用程序中播放.mp3.wav文件?我正在使用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

好吧,我不确定如何使用这些东西,我以前从未使用过它们。我怎样才能做到这一点,如何使用它?
斯坦(Stan)

JFM在2003年被放弃。不建议您使用它。
joshreesjones

3
值得注意的是,在一种main方法中,有必要添加一个Thread.sleep以听到声音,否则程序将在此之前结束。做一个有用的方法是:Thread.sleep(clip.getMicrosecondLength() / 1000);
安德烈·瓦伦蒂

Answers:


119

Java FX具有MediaMediaPlayer类,可以播放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
最终到达网址资源= getClass()。getResource(“ a.mp3”);
尼尔2012年

44
这根本不适合我。它说进口不存在。我正在运行Java 7 ...
PulsePanda 2012年

9
stackoverflow.com/questions/15149547/…如果您使用Eclipse,则似乎需要从Java 7文件夹中手动添加javafx库。
Gyurme 2013年

7
技术上,MediaMediaPlayer不是Java的类,但JavaFX的类。要将mp3支持添加到OS X或Windows上的Java中,您可能需要研究SampledSP。是的-我写了那些库。
Hendrik

8
不要忘记,您还需要初始化javaFX才能使它起作用。stackoverflow.com/questions/14025718/...
user738048


18

您只能使用Java API播放.wav:

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

并使用jLayer播放.mp3


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 2015年

我将代码放入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内部)中的所有 jar

这是一个简约用法示例:

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音乐播放器。它是开放源代码的WinAmp克隆:http : //www.javazoom.net/jlgui/jlgui.html

第一个要看的类是PlayerUI(在包javazoom.jlgui.player.amp内部)。它很好地演示了BasicPlayer的高级功能。


谢谢,这是我尝试向当前应用程序添加mp3支持的最简单方法。 mp3spi1.9.4.jar应该mp3spi1.9.5.jar从java zoom网站替换。
Old Badman Gray 2014年

别忘了之后睡着主线程,player.play()否则您可能听不到任何声音。
jeremyjjbrown 2014年

7

我找到的最简单的方法是从http://www.javazoom.net/javalayer/sources.html下载JLayer jar文件并将其添加到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/…],它会执行诸如停止和暂停之类的所有功能。
弗拉德

1
我认为它应该已经包含那些功能,因为它们看起来很基础。无论如何,我找到了另一个库的另一个解决方案,感谢您的答复:)
N3sh 2014年

5

为了给读者提供另一种选择,我建议使用JACo MP3 Player库,这是一个跨平台的Java mp3播放器。

特征:

  • 非常低的CPU使用率(〜2%)
  • 令人难以置信的小型图书馆(〜90KB)
  • 不需要JMF(Java Media Framework)
  • 易于集成到任何应用程序中
  • 易于集成到任何网页(如applet)中。

有关其方法和属性的完整列表,可以在此处查看其文档。

样例代码:

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依赖关系。

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。
亨德里克

1

在freshmeat.net上搜索JAVE(代表Java音频视频编码器)库(在此处链接))。这是一个用于此类事物的库。我不知道Java是否具有本地mp3功能。

如果要使用一种方法来运行两种类型的文件,则可能需要使用继承和简单的包装函数将mp3函数和wav函数包装在一起。


我真的不知道如何使用自定义库,对此有任何帮助吗?
Stan

下载该库并在代码中编写一个include语句。应该包括有关图书馆使用的说明。通常,一个函数调用就足够了,尽管您可能需要先声明一个对象。然后,创建一个函数来检查其输入的文件扩展名,并调用所需的库函数。
Spencer Rathbun

0

要将MP3读取支持添加到Java Sound,请将mp3plugin.jarJMF的添加到应用程序的运行时类路径中。

请注意,Clip该类具有内存限制,因此不适用于超过几秒钟的高质量声音。


2
JMF于2003年被放弃。不建议您使用它。
joshreesjones

@ mathguy54当我建议人们不要使用它时,是因为它不支持足够不同类型的媒体。尽管如此,它仍然完全可以解码MP3。
2014年

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;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.