首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java声音淡出

java声音淡出
EN

Stack Overflow用户
提问于 2009-01-22 22:31:35
回答 1查看 6K关注 0票数 1

使用javax.sound.sampled,我想要淡出我开始无限循环的声音。这就是我开始声音的方式:

代码语言:javascript
复制
Clip clip = AudioSystem.getClip();
AudioInputStream inputStream = AudioSystem
.getAudioInputStream(new File("x.wav"));
clip.open(inputStream);
clip.loop(clip.LOOP_CONTINUOUSLY);

有谁能告诉我如何做到这一点吗?我是否应该使用不同的声音系统,比如FMOD (如果这在Java中是可能的)?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-01-25 17:11:02

看看这里:Openjava sound demo

他们使用FloatControl gainControl; // for volume

代码语言:javascript
复制
/**
 * 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
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/471112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档