Java AudioSystem .wav 文件行为差异

标签 java audio wav javasound

我有许多从 Java 播放的 .wav 文件。在这个精简的示例中,“滴水”是可以听到的,但“嗖嗖”是听不到的,即使它们通过相同的代码运行。 “swish”似乎没有什么不寻常的地方:它在 Gnome 桌面上播放。我有一个类似的应用程序,不像剥离那样播放“嗖嗖声”而不是“滴水”,所以这似乎不是与数据性质相关的问题。

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

编辑 经过一些试验,似乎加载的第一个剪辑将是有效的。 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 };
}

最佳答案

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

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

关于Java AudioSystem .wav 文件行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8778114/

相关文章:

Java:部分路径存在,文件的部分名称

java 调用另一个类的方法从同一个包中打印

html - HTML5音频控件在Android上不起作用

audio - 无法使用 sox、avconv 将特定的 .wav 文件转换为 mp3 或 m4a

javascript - 如何处理 Uncaught (in promise) DOMException : The play() request was interrupted by a call to pause()

java - 如何创建具有继承模块和聚合模块的 Maven 原型(prototype)?

java - 使用 Java 的 Akka 远程路由

python - pygame,无法导入声音

javascript - <audio> 开始播放时发生的事件

android - MediaExtractor 在与 wav 文件一起使用时抛出 IllegalArgumentException