当前位置:  开发笔记 > 编程语言 > 正文

我怎样才能用Java播放声音?

如何解决《我怎样才能用Java播放声音?》经验,为你挑选了5个好方法。

我希望能够在我的程序中播放声音文件.我应该在哪里看?



1> pek..:

我写了下面的代码,工作正常.但我认为它只适用于.wav格式.

public static synchronized void playSound(final String url) {
  new Thread(new Runnable() {
  // The wrapper thread is unnecessary, unless it blocks on the
  // Clip finishing; see comments.
    public void run() {
      try {
        Clip clip = AudioSystem.getClip();
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(
          Main.class.getResourceAsStream("/path/to/sounds/" + url));
        clip.open(inputStream);
        clip.start(); 
      } catch (Exception e) {
        System.err.println(e.getMessage());
      }
    }
  }).start();
}


1)`Thread`是不必要的.2)有关使用`Clip`的一个很好的例子,请参阅[JavaSound信息.页面(http://stackoverflow.com/tags/javasound/info).3)如果一个方法需要一个`URL`(或`File`)给它一个dang`URL`(或`File`)而不是接受一个代表一个的`String`.(只是个人'蜜蜂在我的帽子里'.)4)`e.printStackTrace();`提供的信息比`System.err.println(e.getMessage())的输入更少;`.
为了避免Clip在随机时间关闭,需要LineListener.看看:http://stackoverflow.com/questions/577724/trouble-playing-wav-in-java/577926#577926
Thanx ..这是多余的吗?我把它变成了一个新线程,所以我可以在第一个剪辑结束之前再次播放声音.
我知道clip.start()产生一个新线程,所以我很确定它是不必要的.
+1表示使用公共API的解决方案.是不是不需要创建一个新的线程(冗余)?

2> Greg Hurlman..:

一个坏例子:

import  sun.audio.*;    //import the sun.audio package
import  java.io.*;

//** add this into your application code as appropriate
// Open an input stream  to the audio file.
InputStream in = new FileInputStream(Filename);

// Create an AudioStream object from the input stream.
AudioStream as = new AudioStream(in);         

// Use the static class member "player" from class AudioPlayer to play
// clip.
AudioPlayer.player.start(as);            

// Similarly, to stop the audio.
AudioPlayer.player.stop(as); 


这个例子来自1997年的JavaWorld文章.过时了,你不应该使用sun.*包.
http://java.sun.com/products/jdk/faq/faq-sun-packages.html有公共API替代使用sun.audio.
使用太阳.*包来代替*不*.他们有奇怪的错误,如不处理文件> 1MB,如果前一个尚未完成,则无法播放一个剪辑等.
@GregHurlman是不是太阳.*包装不是我们开发人员使用的?
你有没有需要关闭"in"?

3> Cyril Duchon..:

我不想拥有这么多代码只是为了播放一个简单的该死的声音.如果你有JavaFX包(已经包含在我的jdk 8中),这可以工作.

private static void playSound(String sound){
    // cl is the ClassLoader for the current class, ie. CurrentClass.class.getClassLoader();
    URL file = cl.getResource(sound);
    final Media media = new Media(file.toString());
    final MediaPlayer mediaPlayer = new MediaPlayer(media);
    mediaPlayer.play();
}

注意:您需要初始化JavaFX.一个快速的方法是在你的应用程序中调用一次JFXPanel()的构造函数:

static{
    JFXPanel fxPanel = new JFXPanel();
}



4> 小智..:

要在java中播放声音,可以参考以下代码.

import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;
import javax.swing.*;

// To play sound using Clip, the process need to be alive.
// Hence, we use a Swing application.
public class SoundClipTest extends JFrame {

   public SoundClipTest() {
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setTitle("Test Sound Clip");
      this.setSize(300, 200);
      this.setVisible(true);

      try {
         // Open an audio input stream.
         URL url = this.getClass().getClassLoader().getResource("gameover.wav");
         AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
         // Get a sound clip resource.
         Clip clip = AudioSystem.getClip();
         // Open audio clip and load samples from the audio input stream.
         clip.open(audioIn);
         clip.start();
      } catch (UnsupportedAudioFileException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (LineUnavailableException e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {
      new SoundClipTest();
   }
}



5> Andrew Jenki..:

无论出于何种原因,当我调用this.getClass()。getResourceAsStream()时,wchargin的最高答案是给我一个空指针错误。

对我有用的是:

void playSound(String soundFile) {
    File f = new File("./" + soundFile);
    audioIn = AudioSystem.getAudioInputStream(f.toURI().toURL());  
    Clip clip = AudioSystem.getClip();
    clip.open(audioIn);
    clip.start();
}

我会用以下声音播放声音:

 playSound("sounds/effects/sheep1.wav");

sounds / effects / sheep1.wav位于Eclipse中我项目的基本目录中(因此不在src文件夹中)。

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有