关于html:Dart中Dartium和Web Audio API的声音失真

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处理程序。