我對HTML5音頻api非常陌生:我已閱讀HTML5 Rocks的一些相關文章,但它有時候會在Javascript和Dart之間有點棘手的翻轉。Dartium中的Dartium和Web Audio API扭曲的聲音
無論如何,我一直在用Dart試驗HTML5音頻。爲了製作簡單遊戲的音效,我創建了一個類如下。我創建了一個AudioContext,加載的聲音數據轉換成SoundBuffers,而當要播放所需要的聲音,產生經由其播放存儲在緩衝器中的數據的AudioBufferSourceNode:
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方法來播放聲音效果。
例如
#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團隊有一個[git repo](https://github.com/dart-lang/dart-html5-samples),他們將HTML5 Rocks教程移植到Dart。其中之一是[Web Audio API入門]的端口(http://www.html5rocks.com/en/tutorials/webaudio/intro/)。不知道這是你以後的樣子,但它是[這裏](https://github.com/dart-lang/dart-html5-samples/blob/master/webaudio/intro/filter_sample.dart),如果你想看看他們是怎麼做到的。 – scribeGriff
謝謝!這聽起來是一個很好的起點。我一定會檢查出來。 –
就像更新:我看了一下上面鏈接的git repo;問題似乎在於我使用的音頻文件:它是一個32位.wav,而示例中的聲音是16位。當我將我的聲音文件保存爲16位.wav文件時,它們在Chrome和Safari中均按預期播放... –