Java AudioSystem .wav文件的行为差异

时间:2012-01-08 13:56:00

标签: java audio wav javasound

我从Java玩过很多.wav文件。在这个剥离的例子中,“滴水”是可听见的,但是“sw”“即使它们通过相同的代码运行也是如此。 “swish”似乎没有任何异常:它来自Gnome桌面。我有一个类似的应用程序,不像剥离那样播放“swish”而不是“drip”所以再次它似乎不是一个与数据的性质相关的问题。

这里有什么想法吗?在已知正在工作的代码在重建系统上“重新部署”后,会发现此错误:重新安装Ubuntu 10.10和Eclipse Indigo。 Sun JDK 6和OpenJDK 6都会出现此错误。编辑“重建”系统实际上也是不同的硬件:Intel E6500(2核,2.93 GHz)我只安装了Ubuntu,Eclipse,OpenJDK ,Sun JDK。之前的系统是AMD 630(4核,2.8 GHz),带有Ubuntu,Eclipse,OpenJDK(我认为)。

编辑经过一些实验,似乎加载的第一个剪辑将是有效的剪辑。 TestSounder构造函数加载它们,以便顺序可以反转。也许使用静态方法AudioSystem.getLine与它有关,因为这显然是非面向对象的操作。

import java.io.IOException;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Clip;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.sound.sampled.LineUnavailableException;

public class TestSounder
{
    String resourcePathFromBin = "/resources/";

    Clip dripClip;
    Clip swishClip;

    public TestSounder()
    {
        dripClip = setupClip("drip.wav");
        swishClip = setupClip("swish.wav");
    }

    public void close()
    {
        dripClip.close();
        swishClip.close();
    }

    private Clip setupClip(String fileName)
    {
        Clip clip = null;
        try
        {
            AudioInputStream ais = 
                AudioSystem.getAudioInputStream(this.getClass().getResourceAsStream(resourcePathFromBin + 
                                                                                    fileName));
            AudioFormat af = ais.getFormat();
            DataLine.Info lineInfo = new DataLine.Info(Clip.class, af);
            clip = (Clip)AudioSystem.getLine(lineInfo);
            clip.open(ais);
        }
        catch (UnsupportedAudioFileException e)
        {
            assert false: "bug";
        }
        catch (IOException e)
        {
            assert false: "bug";
        }
        catch (LineUnavailableException e)
        {
            assert false: "bug";
        }
        return clip;
    }

    public void go(UtilityK.Sounds s)
    {
        Clip clip = null;
        if (s == UtilityK.Sounds.drip)
            clip = dripClip;
        if (s == UtilityK.Sounds.swish)
            clip = swishClip;

        clip.stop();
        clip.setFramePosition(0);
        clip.start();
        //while (clip.isRunning())
        //    TestSounder.delay();
    }

    public static void main(String[] args)
    {
        TestSounder obj = new TestSounder();

        obj.go(UtilityK.Sounds.swish);
        TestSounder.delay();

        obj.go(UtilityK.Sounds.drip);
        TestSounder.delay();

        obj.go(UtilityK.Sounds.swish);
        TestSounder.delay();

        obj.go(UtilityK.Sounds.drip);
        TestSounder.delay();

        obj.close();
    }

    private static void delay()
    {
        Thread.sleep(5000);
    }
}

public interface UtilityK
{
    enum Sounds { drip, swish };
}

1 个答案:

答案 0 :(得分:0)

这是另一种方法。它似乎非常适合可能需要经常播放或作为用户反馈快速连续播放的短音。

link to a way to play two kinds of beeps that come from .wav files