所以基本上我已经在 Chrome 中对此进行了测试,可能代码的顺序是关闭的或者其他什么,由于范围请求错误,试图使用“网络音频”覆盖 HTML5 音频的一些功能,用于制作带有循环声音的游戏效果和音乐...
我收到“非法异常”错误。这是代码:
var url='example.mp3';
var a_result=new Object();
a_result.loaded=false;
a_result.evalstring='';
a_result.loop=false;
a_result.play=function(){
var asrc=a_result.source;
asrc.loop=a_result.loop;
//try{
var playfunc=asrc.start||asrc.noteOn;
playfunc(0);
//}catch(e){
/* do nothing */
//}
}
a_result.pause=function(){
var asrc=a_result.source;
try{
var stopfunc=asrc.stop||asrc.noteOff;
stopfunc(0);
}catch(e){
/* do nothing */
}
}
var asrc=actx.createBufferSource();
asrc.connect(actx.destination);
var req=new XMLHttpRequest();
req.open('GET',url,true);
req.responseType='arraybuffer';
req.onload=function(){
if(a_result.loaded==false){
asrc.buffer=actx.createBuffer(req.response,false);
a_result.source=asrc;
a_result.loaded=true;
}
var cont=a_result;
eval(cont.evalstring);
}
req.onerror = function() {
if(a_result.loaded==false){
a_result.loaded=true;
}
}
try{
req.send(null);
}catch(e){
req.onerror();
}
return a_result;
然后在声音加载后我做了类似的事情:
a_result.play();
而不是播放它会给出错误。
这是一个使用上述代码和下面建议的修复程序的声音测试,它可以在 Chrome 中运行,成功地解决了蹩脚的网络服务器上的范围请求问题。这是另一个有问题的问题(在 asrc.buffer=actx.createBuffer(req.response,false); 在 Iron 中抛出某种“无效字符串”错误并在 Chrome 中默默地搞砸了)。
这是根据建议编辑的代码:
var url='example.mp3'
var a_result=new Object();
a_result.loaded=false;
a_result.evalstring='';
a_result.loop=false;
a_result.play=function(){
var asrc=a_result.source;
asrc.loop=a_result.loop;
try{
if(asrc.start){
asrc.start(0);
}else{
asrc.noteOn(0);
}
}catch(e){
/* do nothing */
}
}
a_result.pause=function(){
var asrc=a_result.source;
try{
if(asrc.stop){
asrc.stop(0);
}else{
asrc.noteOff(0);
}
}catch(e){
/* do nothing */
}
}
var asrc=actx.createBufferSource();
asrc.connect(actx.destination);
var req=new XMLHttpRequest();
req.open('GET',url,true);
req.responseType='arraybuffer';
req.onload=function(){
actx.decodeAudioData(req.response,function(buffer){
if(buffer){
if(a_result.loaded==false){
asrc.buffer=buffer;
a_result.source=asrc;
a_result.loaded=true;
}
var cont=a_result;
eval(cont.evalstring);
}
});
}
req.onerror = function() {
if(a_result.loaded==false){
a_result.loaded=true;
}
}
try{
req.send(null);
}catch(e){
req.onerror();
}
return a_result;
它似乎不再有语法错误,但是,它似乎没有解决 Chrome 上的可玩性问题(更新了上面的第二个测试用例)。具体来说,在声音停止后,它不想再次播放。-- 显然是因为它在规范中。每次播放时都必须将缓冲区应用于新的声源。