如何在JavaScript中同步播放音频文件?
如何在JavaScript中同步播放音频文件?
我正在开发一个将文本转换为莫尔斯码音频的程序。
比如我输入sos
。我的程序将把它转换成数组[1, 1, 1, 0, 2, 2, 2, 0, 1, 1, 1]
。其中s = 点 点 点
(或者1, 1, 1
),o = 划线 划线 划线
(或者2, 2, 2
)。这部分相当简单。
接下来,我有两个音频文件:
var dot = new Audio('dot.mp3'); var dash = new Audio('dash.mp3');
我的目标是编写一个函数,当它遇到1
时播放dot.mp3
,遇到2
时播放dash.mp3
,遇到0
时暂停。
下面这段代码有点/有些时候能工作,但我认为它基本上有缺陷,而且我不知道如何修复它。
function playMorseArr(morseArr) { for (let i = 0; i < morseArr.length; i++) { setTimeout(function() { if (morseArr[i] === 1) { dot.play(); } if (morseArr[i] === 2) { dash.play(); } }, 250*i); } }
问题:
我可以循环遍历数组并播放音频文件,但时间控制是一个挑战。如果我没有正确设置setTimeout()
的间隔,如果上一个音频文件还没有播放完,而250ms
已经过去,那么数组中的下一个元素将被跳过。所以dash.mp3
的长度比dot.mp3
长。如果我的时间控制太短,我可能会听到[点 点 点 暂停 划线 划线 暂停 点 点 点]
,或者类似这样的效果。
我想要的效果
我希望程序像这样运行(伪代码):
- 查看数组的第ith个元素
- 如果是
1
或2
,开始播放音频文件,否则创建一个暂停 - 等待音频文件或暂停结束
- 增加
i
,并返回到步骤1
我想到的解决方法,但不知道如何实施
问题是我希望循环同步进行。我在一些需要按特定顺序执行多个函数的情况下使用过promise,但我该如何链接不确定数量的函数呢?
我还考虑过使用自定义事件,但我遇到了同样的问题。