0

基本的に私はこれを Chrome でテストしましたが、おそらくコードの順序がずれているか、レンジ リクエストのバグのために「Web オーディオ」を使用して 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 で動作し、粗末な Web サーバーでの範囲リクエストの問題をうまく回避しています。問題のある別のものがあります(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 でのプレイアビリティの問題は解決していないようです (上記の 2 番目のテスト ケースが更新されました)。具体的には、サウンドが停止した後、再び再生する必要はありません。――どうやら仕様のせいですね。バッファは、再生するたびに新しい音源に適用する必要があります。

4

2 に答える 2

1

play メソッド (start() または noteOn()) は、buffersourcenode オブジェクトで呼び出す必要があり、関連付けを解除する必要はありません。いくつかのオプションがあります:

1) オーディオ コンテキストの monkeypatch ライブラリ ( https://github.com/cwilso/AudioContext-MonkeyPatch/ ) を含めて、新しい (start()) 構文を使用することを強くお勧めします。大騒ぎする必要はありません。

2) playfunc を使用する代わりに、if ステートメントを使用して切り替えることができます。

if (asrc.start)
    asrc.start(0);
else
    asrc.noteOn(0);

3) play 関数をオブジェクトに bind() して、コードを本質的に同じに保つことができます。

var playfunc=asrc.start ? asrc.start.bind(asrc) || asrc.noteOn.bind(asrc);
playfunc(0);

4) playfunc() メソッドをオブジェクト自体にプッシュできます (これでうまくいくと思います):

asrc.playfunc=asrc.start||asrc.noteOn;
asrc.playfunc(0);
于 2013-11-07T16:19:27.923 に答える
1

新しいページでは、XMLHTTPRequest の結果に対して createBuffer(data, false) を呼び出しています。代わりに、ほとんどの場合、これらの結果に対して decodeAudioData() を呼び出したいと考えています。createBuffer には 2 パラメータ バージョンがなく、任意のデータをバッファ。コードをブラウズすると、MP3 または Ogg ファイルを取得しているように見えます。それらをデコードする必要があります。

于 2013-11-08T18:43:46.827 に答える