2

这就是我到目前为止所拥有的一切。但我不确定这是否是播放音频文件的最佳方式,我也想知道如何重复音频文件。有什么建议吗?

package ponggame;

import java.applet.Applet;

import java.applet.AudioClip;

public class Sound {

    public static final Sound bgMusic = new Sound("/pong.wav");
    public static final Sound hitPaddle = new Sound("/bounce.wav");

    private AudioClip clip;

    public Sound(String fileName) {
        try {
            // gets the sound file that is passed in the constructor
            clip = Applet.newAudioClip(Sound.class.getResource(fileName));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // plays the music, obviously
    public void play() {
        try {
            new Thread() { //multi-tasking stuff
                public void run(){
                        clip.play();

                }
            }.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4

3 回答 3

2

我不确定这是否是播放音频的最佳方式

是的,你做对了,假设这是一个小程序。此外,鉴于您不确定 的使用AudioClip,您在 a 后面对它的抽象Sound是对抽象的一种很好的使用——尽管您不需要在单独的线程上启动音频,除非您发现播放开始时间的延迟是不可接受的(play()将立即返回,剪辑将异步播放)。

并且还想知道如何重复音频。

AudioClip.loop()。当您调用它时,它将开始循环播放音频,直到您调用stop().

于 2013-11-06T01:53:45.520 回答
1

看看我为此做的代码:

import java.net.URL;

import javax.sound.sampled.*;
/**
 * This class is designed to take the filename of a .wav 
 * inside of the com.Game package and turn it into a Clip with a playClip() 
 * method
 * @author michaelsnowden
 *
 */
public class Audio 
{
    URL url;
    Clip clip;
    AudioInputStream ais;

    public Audio(String st)
    {   
        clip = null;

        try{
            AudioInputStream audioIn = AudioSystem.getAudioInputStream( getClass().getResource(st));
            clip = AudioSystem.getClip();
            clip.open(audioIn);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

    public void playClip()
    {
        if( clip.isRunning() )
        {
            clip.stop();
        }
        clip.setFramePosition( 0 );
        clip.start();
    }
}

老实说,它与您正在做的事情并没有太大的不同,但它更有效,并且内置了您想要的方法。

将此类放入您的包中,然后将 .wav 文件也放入您的包中。只需拖放它们。然后,在您的 Applet 中,只需使用 .wav 文件的名称作为字符串实例化此类的对象。例如,Audio catMeow = new Audio("loud_meow.wav")。然后,后来,catMeow.playClip();

于 2013-11-06T01:55:15.143 回答
0

如果您只想多次播放音频,则可以使用whileorfor循环来调用您的play()方法。以下是两者的示例:

    for(int i = 5; i > 0; i--) {   //For loops work like this: int i = 5 (declare the   
          play();//temporary variable); i > 0 (the condition, so as long as i is 
                //larger than 0, the loop will execute); i-- (what to do after each iteration of the loop).
    }

int j = 5;
while(j > 0) {
      play();
      j--;
}

在每种情况下,声音都应播放五次。
AudioClip.loop();也有效。

于 2013-11-06T01:58:19.000 回答