代码之家  ›  专栏  ›  技术社区  ›  Allanrbo

java声音淡出

  •  1
  • Allanrbo  · 技术社区  · 17 年前

    使用javax.sound.sampled,我想淡化我开始无限循环的声音。我是这样开始发声的:

    Clip clip = AudioSystem.getClip();
    AudioInputStream inputStream = AudioSystem
    .getAudioInputStream(new File("x.wav"));
    clip.open(inputStream);
    clip.loop(clip.LOOP_CONTINUOUSLY);
    

    有人能告诉我怎么做吗?我是否应该使用不同的音响系统,如FMOD(如果Java中可以的话)?谢谢。

    1 回复  |  直到 17 年前
        1
  •  4
  •   Tim    17 年前

    请看这里: Openjava sound demo
    FloatControl gainControl; // for volume

    /**
     * Set the volume to a value between 0 and 1.
     */
    public void setVolume(double value) {
        // value is between 0 and 1
        value = (value<=0.0)? 0.0001 : ((value>1.0)? 1.0 : value);
        try {
            float dB = (float)(Math.log(value)/Math.log(10.0)*20.0);
            gainControl.setValue(dB);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    
    /**
     * Fade the volume to a new value.  To shift volume while sound is playing,
     * ie. to simulate motion to or from an object, the volume has to change
     * smoothly in a short period of time.  Unfortunately this makes an annoying
     * clicking noise, mostly noticeable in the browser.  I reduce the click
     * by fading the volume in small increments with delays in between.  This
     * means that you can't change the volume very quickly.  The fade has to
     * to take a second or two to prevent clicks.
     */
    float currDB = 0F;
    float targetDB = 0F;
    float fadePerStep = .1F;   // .1 works for applets, 1 is okay for apps
    boolean fading = false;
    
    public void shiftVolumeTo(double value) {
        // value is between 0 and 1
        value = (value<=0.0)? 0.0001 : ((value>1.0)? 1.0 : value);
        targetDB = (float)(Math.log(value)/Math.log(10.0)*20.0);
        if (!fading) {
            Thread t = new Thread(this);  // start a thread to fade volume
            t.start();  // calls run() below
        }
    }
    
    /**
     * Run by thread, this will step the volume up or down to a target level.
     * Applets need fadePerStep=.1 to minimize clicks.
     * Apps can get away with fadePerStep=1.0 for a faster fade with no clicks.
     */
    public void run()
    {
        fading = true;   // prevent running twice on same sound
        if (currDB > targetDB) {
            while (currDB > targetDB) {
                currDB -= fadePerStep;
                gainControl.setValue(currDB);
                try {Thread.sleep(10);} catch (Exception e) {}
            }
        }
        else if (currDB < targetDB) {
            while (currDB < targetDB) {
                currDB += fadePerStep;
                gainControl.setValue(currDB);
                try {Thread.sleep(10);} catch (Exception e) {}
            }
        }
        fading = false;
        currDB = targetDB;  // now sound is at this volume level
    }
    
    推荐文章