gpt4 book ai didi

javascript - 使用 Web Audio API 通过 start/noteOn 进行非法调用

转载 作者:行者123 更新时间:2023-12-02 18:09:27 24 4
gpt4 key购买 nike

所以基本上我已经在 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();

并且没有播放它而是给出了错误。

Here是一个健全的测试,使用上面的代码和下面建议的修复,它可以在 Chrome 中运行,成功解决了蹩脚的网络服务器上的范围请求问题。 Here是另一个有问题的问题(在 Iron 中抛出某种“无效字符串”错误 asrc.buffer=actx.createBuffer(req.response,false); 并在 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 上的可玩性问题(上面的第二个测试用例已更新)。具体来说,声音停止后就不想再播放了。 ——显然是因为它在规范中。每次播放时都必须将缓冲区应用于新的声源。

最佳答案

在新页面中,您对 XMLHTTPRequest 的结果调用 createBuffer(data, false)。您几乎肯定希望对这些结果调用decodeAudioData(),相反 - createBuffer 没有 2 参数版本,并且与您传递的参数不匹配,即使您尝试将任意数据推送到缓冲。从您的代码浏览来看,您似乎正在下载 MP3 或 Ogg 文件 - 您需要对它们进行解码。

关于javascript - 使用 Web Audio API 通过 start/noteOn 进行非法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19830330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com