2

私は、リモート サーバーから 3 分間のオーディオ クリップ (mp3) を読み込んで再生する Ionic/Cordova アプリに取り組んでいます。

このチュートリアル ( http://www.html5rocks.com/en/tutorials/webaudio/intro/ ) に従いましたが、読み込みと再生は正常に機能します。

ただし、ロードされたmp3をローカルに保存/キャッシュして、ユーザーが一度ダウンロードするだけでアプリがオフラインで動作できるようにします。ファイルは約 750 KB です。以下の例では、ファイルはわずか 74 KB です。

アプリの他の場所では、Mozilla の localForage を ([ngular-localForage 経由で) 使用しています。これは、特に ArrayBuffers を格納するために使用できると述べています - http://mozilla.github.io/localForage/#setitem

ただし、再生できる形式でオーディオを取得できないようです...間違ったものを保存していると思われます-ArrayBufferが何であるかがよくわかりません!

とにかく、これが私の基本的なコードです(現在、ローカルファイルを使用しています)。最初のロードでオーディオが正しく再生され、2 番目のロードでエラーが発生します (以下を参照)。

window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();

function loadDingSound() {

    // attempt to retrieve stored file
    $localForage.getItem('ding').then(function (response) {

        if (response) {

            console.log('playing audio from localForage');

            console.log(response);

            context.decodeAudioData(response, function(buffer) {
                playSound(buffer);
            });

        } else {

            var request = new XMLHttpRequest();

            request.open('GET', 'audio/ding.mp3', true); // loading local file for now
            request.responseType = 'arraybuffer';

            // Decode asynchronously
            request.onload = function() {

                $localForage.setItem('ding', request.response).then(function () {

                    context.decodeAudioData(request.response, function(buffer) {

                        playSound(buffer);

                    });

                });

            };
            request.send();
        }

    });

}

function playSound(buffer) {

    var source = context.createBufferSource(); // creates a sound source
    source.buffer = buffer;                    // tell the source which sound to play
    source.connect(context.destination);       // connect the source to the context's destination (the speakers)
    source.start(0);                           // play the source now
}

// init
loadDingSound();

そして、コンソールに表示される応答は次のとおりです。

Object {} // line 13
Error: Failed to execute 'decodeAudioData' on 'AudioContext': invalid ArrayBuffer for audioData. // line 15

現時点では、これを Chrome でのみテストしており、Cordova アプリではテストしていません。

私は何を間違っていますか?または、これを行うためのより良い方法はありますか? おそらく、代わりに MP3 をファイル システムに保存できますか?

4

1 に答える 1