【问题标题】:Playing .mp3 and .wav in Java?在 Java 中播放 .mp3 和 .wav?
【发布时间】:2011-08-28 01:44:26
【问题描述】:

如何在我的 Java 应用程序中播放 .mp3.wav 文件?我正在使用摇摆。我尝试在互联网上查找类似以下示例的内容:

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 文件。

【问题讨论】:

  • 看起来你需要某种插件。 JMF 应该有你需要的东西。 oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
  • 嗯,我不知道如何使用这些东西,我以前从未使用过它们。我该如何实现它,我该如何使用它?
  • JFM在2003年被废弃了,不推荐使用。
  • 值得注意的是,在main方法中,必须添加Thread.sleep才能听到声音,否则程序将在此之前结束。一个有用的方法是:Thread.sleep(clip.getMicrosecondLength() / 1000);

标签: java audio mp3 wav


【解决方案1】:

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;

【讨论】:

  • 最终 URL 资源 = getClass().getResource("a.mp3");
  • 这根本不适合我。它说进口不存在。我正在运行 java 7...
  • stackoverflow.com/questions/15149547/… 如果您使用 Eclipse,您似乎需要从 Java 7 文件夹中手动添加 javafx 库。
  • 技术上,MediaMediaPlayer 不是 Java 类,而是 JavaFX 类。要在 OS X 或 Windows 上为 Java 添加 mp3 支持,您可能需要查看SampledSP。是的 - 我写了那些库。
  • 不要忘记您还需要初始化 javaFX 才能使其正常工作。 stackoverflow.com/questions/14025718/…
【解决方案2】:

我写了一个纯java的mp3播放器:mp3transform.

【讨论】:

  • 有计划将项目推送到github吗? =)
【解决方案3】:

使用标准 javax.sound API,单个 Maven 依赖,完全开源(Java 7 或更高版本),应该可以播放大多数 WAV、OGG Vorbis 和 MP3 文件:

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: could not get audio input stream from input file
  • 我把代码放到了一个 Maven 模块中。它绝对有效:search.maven.org/…
  • 我可以将版本号升级到:com.googlecode.soundlibstritonus-share0.3.7.4com.googlecode.soundlibsmp3spi1.9.5.4com. googlecode.soundlibsvorbisspi1.0.3-2
  • 只有最新的verbisspi 1.0.3.3不起作用。
  • @RafiAlhamd :确保所有的 Maven 依赖项都作为 jars 在你的类路径中。
【解决方案4】:

您只能使用 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

【讨论】:

  • 这是错误的。 Java 将播放除 wav 之外的其他容器格式。此外,wav 是一种容器格式,甚至可以包含 mp3。所以Java不能播放所有的wav文件。
【解决方案5】:

我已经有一段时间没有使用它了,但是JavaLayer 非常适合 MP3 播放

【讨论】:

  • 是的,这很酷。简单,似乎不依赖于平台。在后台播放良好,只需要弄清楚如何停止线程。
【解决方案6】:

我建议使用 BasicPlayerAPI。它是开源的,非常简单,不需要 JavaFX。 http://www.javazoom.net/jlgui/api.html

下载并解压 zip 文件后,应将以下 jar 文件添加到项目的构建路径中:

  • basicplayer3.0.jar
  • 所有来自 lib 目录(在 BasicPlayer3.0 中)的 jars

这是一个简约的用法示例:

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 应该替换为来自 java zoom 站点的 mp3spi1.9.5.jar
  • 别忘了在player.play()之后让你的主线程休眠,否则你可能听不到任何声音。
【解决方案7】:

我发现最简单的方法是从http://www.javazoom.net/javalayer/sources.html下载JLayer jar文件并将其添加到Jar库http://www.wikihow.com/Add-JARs-to-Project-Build-Paths-in-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;

【讨论】:

  • 是的,它确实查看了这个视频 [youtube.com/… 它完成了停止和暂停等所有功能。
  • 我认为它应该已经包含这些功能,因为它们看起来相当基本。无论如何,我找到了另一个库的另一个解决方案,感谢您的回复:)
【解决方案8】:

为了给读者另一种选择,我建议JACo MP3 Player library,一个跨平台的java mp3播放器。

特点:

  • 非常低的 CPU 使用率 (~2%)
  • 令人难以置信的小型库 (~90KB)
  • 不需要 JMF(Java 媒体框架)
  • 易于集成到任何应用程序中
  • 易于集成到任何网页中(作为小程序)。

有关其方法和属性的完整列表,您可以查看其文档here

示例代码:

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

有关更多详细信息,我创建了一个简单的教程here,其中包含可下载的源代码。

【讨论】:

  • 哇,太简单了。
  • 源代码下载没有将实际源代码提供给库?
  • 现在是 2021 年,这就像一个魅力!我做了很多研究,发现了这一点并尝试了它,它奏效了。最简单的,这很容易。谢了哥们!我不知道这个答案怎么会有这么少的赞成票。
【解决方案9】:

使用MP3 Decoder/player/converter 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);
    }

  }

}

【讨论】:

    【解决方案10】:

    您需要先安装 JMF (download using this link)

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

    不要忘记添加 JMF jar 文件

    【讨论】:

    • 请注意,JMF 早就被 Sun/Oracle 抛弃了。
    【解决方案11】:

    在freshmeat.net 上搜索JAVE(代表Java Audio Video Encoder)库(链接here)。它是这类东西的图书馆。我不知道Java是否有原生的mp3功能。

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

    【讨论】:

    • 我真的不知道如何使用自定义库,有什么帮助吗?
    • 下载库并在代码中编写包含语句。应该有关于图书馆使用的说明。通常,一个函数调用就足够了,尽管您可能需要先声明一个对象。然后,创建一个检查其输入文件扩展名的函数,并调用所需的库函数。
    【解决方案12】:

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

    请注意,Clip 类具有内存限制,使其不适用于几秒钟以上的高质量声音。

    【讨论】:

    • JMF在2003年被废弃了,不推荐使用。
    • @mathguy54 我建议人们不要使用它是因为它不支持足够多的不同类型的媒体。尽管如此,它仍然完全足以解码 MP3。
    【解决方案13】:

    我还有其他方法,第一个是:

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

    如果我们想停止这个循环,我们在 try 中添加这个库:

    AudioPlayer.player.stop(s);
    

    对于这第三种方法,我们添加以下导入:

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

    【讨论】:

      【解决方案14】:

      没有任何效果。但是这个完美?

      先google并下载Jlayer库。

      import javazoom.jl.player.Player;
      import java.io.FileInputStream;
      
      public class MusicPlay {
      
        public static void main(String[] args)  {
      
          try{
      
            FileInputStream fs = new FileInputStream("audio_file_path.mp3");
            Player player = new Player(fs);
            player.play();
      
          } catch (Exception e){
            // catch exceptions.
          }
      
        }
      }
      

      【讨论】:

        【解决方案15】:

        使用这个库: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){}
        }
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        • 1970-01-01
        • 2012-05-15
        • 2012-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多