为了我的游戏需要,我需要有 2D 声音。这意味着,发射器应位于 2D 平面上的某个位置。如何在 Javascript 中实现这种效果?我需要使用特殊的声音格式还是可以控制扬声器的音量?
我想我可以达到每个扬声器有 2 个音量的地步,但我不知道如何在 Javascript 中为相同的声音应用不同的音量。
为了我的游戏需要,我需要有 2D 声音。这意味着,发射器应位于 2D 平面上的某个位置。如何在 Javascript 中实现这种效果?我需要使用特殊的声音格式还是可以控制扬声器的音量?
我想我可以达到每个扬声器有 2 个音量的地步,但我不知道如何在 Javascript 中为相同的声音应用不同的音量。
可以在此处找到准确描述此内容的文章(包括演示)。
为了防止链接失效,我将在下面引用最相关的部分
幸运的是,Web Audio API 带有内置的硬件加速定位音频功能,使用起来非常简单。
核心思想体现在下面的代码中:
PositionSample.prototype.changePosition = function(position) {
// Position coordinates are in normalized canvas coordinates
// with -0.5 < x, y < 0.5
if (position) {
if (!this.isPlaying) {
this.play();
}
var mul = 2;
var x = position.x / this.size.width;
var y = -position.y / this.size.height;
this.panner.setPosition(x * mul, y * mul, -0.5);
} else {
this.stop();
}
};
上面第一个链接中的工作演示的完整源代码可以在这里找到。
题外话:我认为在这里手动重写引用的文章作为自定义答案,但这似乎相对没有意义,因为文章已经足够清晰并且做双重工作似乎没有意义
兼容性方面,只有 Flash 和前面提到的代码的组合才能提供真正的跨浏览器定位/平移音频解决方案(因为 Flash 在某些移动设备上不可用)。理想情况下,如果可以规避这种情况,我建议不要使用音频 API,因为规范中的事情不太可能发生变化,因此可能会破坏您的代码(+ 这在移动设备上不起作用的可能性不大)。使用更高级的网络音频 api 的唯一情况是,如果您希望在游戏上至少再工作 6 到 18 个月(因为这可能是实现甚至稳定到可用点所需的时间) .
我们在工作中使用了 SoundManager2,它是一个非常简单的交钥匙解决方案和有据可查的 API。
http://www.schillmania.com/projects/soundmanager2/
例子:
soundManager.createSound({
id:'mySound1',
url:'../mpc/audio/CHINA_1.mp3'
});
soundManager.play('mySound1');
BSD 许可证:http ://www.schillmania.com/projects/soundmanager2/license.txt