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

标签 javascript audio web-audio-api

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

相关文章:

javascript - 这个 JavaScript 函数是什么类型的排序算法?

c++ - 将 24 位有符号整数信号转换为 16 位有符号整数信号

javascript - 网络音频 : No sound in right channel

actionscript-3 - Action 3声音ioError问题

javascript - 如何创建并正确调度AudioBufferSource节点?

html - 在 HTML 中播放实时流式传输 .wav 文件

javascript - 以字符串形式访问对象本身的 PropertyName

javascript - 函数给出错误 "div id"未定义。

javascript - 在同一页面中为不同的字体使用不同的字体大小?

Matlab创建wav文件