如何调整音频循环中的音量?

How to Adjust Volume in an Audio loop?

如何改变循环播放音乐的音量?例如,我正在制作一款游戏,在某一帧我希望将音乐音量 (music.wav) 降低到其音量的一半。

有人怎么能在 AS3 中做到这一点?

您对 "loop" 这个词的使用令人困惑。在编程中,循环通常指的是 "for" 循环之一,如下所示:

for (var i:int = 0; i < 10; i++)
{
   //do stuff 10 times
}

我推测这不是您所说的循环的意思,而是您希望 MovieClip 或主时间线减少 Sound 对象在 n帧。或者你只是说音乐本身在循环播放?希望您看到提出写得好的问题的价值。话虽如此..

请注意,我还没有尝试过,但是根据我的参考书(Lott、Schall 和 Peters 的 ActionScript 3.0 Cookbook),您需要使用一个 SoundTransform 对象来指定音量想要设置声音。试试这个:

var _sound:Sound = new Sound(music.wav); // creates a Sound object which has no internal volume control
var channel:SoundChannel = _sound.play(); // creates a SoundChannel which has a soundTransform property
var transform:SoundTransform = new SoundTransform(); // SoundTransform objects have a property called "volume". This is what you need to change volume.

现在在您的循环中(或在您正在使用的框架事件中)执行此操作:

transform.volume *= 0.9; // or whatever factor you want to have it decrease
//transform.volume /= 1.1; // or this if you prefer.
channel.soundTransform = transform; //

因此,只要您希望音量按此增量减少,运行 这段代码。当然,您需要确保您设置的任何变量都可以在引用它们的代码中访问。想到的一种方法是使用函数。

private function soundDiminish(st:SoundTransform, c:SoundChannel, factor:Number = 0.9):void
{
    st.volume *= factor;
    c.soundTransform = st;
}

现在,只要您想减小音量,只需调用 soundDiminish 函数即可。

也许你的框架事件是这样的:

function onLoadFrame(fe:Event):void
{
    soundDiminish(transform, channel); // 3rd parameter optional
}

如果您只想每 20 帧调用此函数,则:

function onLoadFrame(fe:Event):void
{
    // this is a counter that will count up each time this frame event happens
    frameCount ++;
    if (frameCount >= 20)
    {
        soundDiminish(transform, channel); // 3rd parameter optional
        frameCount = 0; // reset the frame counter
    }
}