SoundManager2 - 停止声音时的失真
Posted
技术标签:
【中文标题】SoundManager2 - 停止声音时的失真【英文标题】:SoundManager2 - Distortion When Stopping Sound 【发布时间】:2012-08-13 01:42:58 【问题描述】:我试图在 SoundManager2 中循环播放一堆声音文件,并在不同的时间点播放它们。下面的代码采用如下所示的 songArray,其中“note”由声音文件和播放该声音文件的持续时间组成:
var songArray = [[null],[["clarinet_e4.mp3",1],["clarinet_a4.mp3",1]],[null],[null],[null],[null],[["clarinet_c4.mp3",1]],[["clarinet_c5.mp3",1]],[null],[["clarinet_ab4.mp3",1]],[["clarinet_f3.mp3",1]],[null],[["clarinet_g4.mp3",1]],[["clarinet_d5.mp3",1]],[null],[null]]
它遍历数组中的每个 X 并播放为给定 X 找到的声音。然后在持续时间给定的时间后停止声音。代码运行完美,只是当声音停止时,它会在歌曲结束时发出爆裂声。
function playSong(X)
playSongNotesAtXValue(X);
window.setTimeout(function()
X++;
if (X >= theSong.songArray.length)
X = 0;
playSong(X);
, (30/theSong.tempo)*1000)
function playSongNotesAtXValue(X)
var columnToPlay = theSong.songArray[X];
if (columnToPlay[0] != null)
for (i = 0; i < columnToPlay.length; i++)
var note = columnToPlay[i];
soundManager.play(note[0],volume:30);
window.setTimeout(function()
soundManager.stop(note[0]);
, (note[1]*30/theSong.tempo)*1000);
对可能出现的问题有什么想法吗?
附:我们已经在最新版本的 Safari、Chrome 和 Firefox 上进行了尝试。
【问题讨论】:
【参考方案1】:如果我没听错的话,您正在播放音频文件,然后在文件中间的任意点停止。这通常会导致输出的不连续性,从而导致爆音或咔嗒声,因为信号在一个样本中从高电平跳到零。为了消除这种情况,您必须将输入的音量从初始音量平滑地减小到零,而不是从初始音量突然变为零。
您通常可以使用线性插值来完成这个“平滑”任务:http://blog.bjornroche.com/2010/10/linear-interpolation-for-audio-in-c-c.html
抱歉,我不太了解 SoundManager2,无法理解您是否已经这样做了。
【讨论】:
以上是关于SoundManager2 - 停止声音时的失真的主要内容,如果未能解决你的问题,请参考以下文章