Distorted sounds with Dartium and Web Audio API in Dart
我对HTML5音频api还是很陌生:我已经阅读了HTML5 Rocks上的一些相关文章,但是有时在Javascript和Dart之间切换可能会有些棘手。
无论如何,我一直在Dart中尝试HTML5音频。为了产生简单游戏的音效,我创建了一个如下类。我创建了一个AudioContext,将声音数据加载到SoundBuffers中,当需要播放声音时,创建了一个AudioBufferSourceNode,通过它可以播放存储在缓冲区中的数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | class Sfx { AudioContext audioContext; List<Map> soundList; int soundFiles; Sfx() { audioContext = new AudioContext(); soundList = new List<Map>(); var soundsToLoad = [ {"name":"MISSILE","url":"SFX/missile.wav"}, {"name":"EXPLOSION","url":"SFX/explosion.wav"} ]; soundFiles = soundsToLoad.length; for (Map sound in soundsToLoad) { initSound(sound); } } bool allSoundsLoaded() => (soundFiles == 0); void initSound(Map soundMap) { HttpRequest req = new HttpRequest(); req.open('GET', soundMap["url"], true); req.responseType = 'arraybuffer'; req.on.load.add((Event e) { audioContext.decodeAudioData( req.response, (var buffer) { // successful decode print("...${soundMap["name"]} loaded..."); soundList.add({"name": soundMap["name"],"buffer": buffer}); soundFiles--; }, (var error) { print("error loading ${soundMap["name"]}"); } ); }); req.send(); } void sfx(AudioBuffer buffer) { AudioBufferSourceNode source = audioContext.createBufferSource(); source.connect(audioContext.destination, 0, 0); source.buffer = buffer; source.start(0); } void playSound(String sound) { for (Map m in soundList) { print(m); if (m["name"] == sound) { sfx(m["buffer"]); break; } } } } |
(声音效果位于文件夹" SFX"中。现在,我看一下代码,可能有百万种更好的方法来组织数据,但是现在不重要了。)我能够播放声音通过创建Sfx实例并调用playSound方法来实现效果。
例如
1 2 3 4 5 6 7 8 9 10 11 | #import('dart:html'); #source('sfx.dart'); Sfx sfx; void main() { sfx = new Sfx(); window.on.keyUp.add((KeyboardEvent keX) { sfx.playSound("MISSILE"); }); } |
(编辑:添加了代码,可以在按键时播放声音。)
问题是:尽管使用dart2js Javascript时,声音效果在Safari中按预期方式播放,但是当它们在Dartium中或(在dart2js Javascript中)在Chrome中播放时,声音效果会失真。 (在Firefox中,甚至存在更严重的问题!)
是否有明显的事情我被忽略或需要考虑?否则,是否有任何参考或教程(最好在Dart上下文中)可能会有所帮助?
感谢您尝试Dart!
首先,Firefox不支持Web Audio API(还可以吗?)Chrome和Safari支持Web Audio API。您可以在此处跟踪Web Audio API的采用情况:http://caniuse.com/#feat=audio-api
第二,请在Dartium中尝试以下Web音频API示例:https://github.com/dart-lang/dart-html5-samples/tree/master/web/webaudio/intro您将需要先克隆存储库并在本地运行。此示例在本地为我工作。
这听起来更像是一个错误报告。如果dart-html5-samples中的示例适用于您,但是您的上述代码仍然失真,请在http://dartbug.com/new上打开一个错误,以便我们进行查看。
要考虑的一件事是等到特定的MISSLE声音加载后再连接keyUp处理程序。