9

मैं वेब ऑडियो एपीआई के साथ खेल रहा हूं और मैं एक गीत के कई हिस्सों को लोड करने की कोशिश कर रहा हूं और उन्हें एक नए ऐरेबफर में जोड़ रहा हूं और फिर इसका उपयोग करता हूं एक गीत के रूप में सभी भागों को खेलने के लिए ArrayBuffer। निम्नलिखित उदाहरण में मैं एक गीत के विभिन्न हिस्सों के बजाय एक ही गीत डेटा (जो एक छोटा पाश है) का उपयोग कर रहा हूं।वेब ऑडियो एपीआई अलग-अलग ऑडियोबफर को जोड़/जोड़ता है और उन्हें एक गीत के रूप में चलाता है

समस्या यह है कि यह अभी भी दो बार की बजाय सिर्फ एक बार खेलता है और मुझे नहीं पता कि क्यों।

Download song

function init() { 

    /** 
    * Appends two ArrayBuffers into a new one. 
    * 
    * @param {ArrayBuffer} buffer1 The first buffer. 
    * @param {ArrayBuffer} buffer2 The second buffer. 
    */ 
    function appendBuffer(buffer1, buffer2) { 
    var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength); 
    tmp.set(new Uint8Array(buffer1), 0); 
    tmp.set(new Uint8Array(buffer2), buffer1.byteLength); 
    return tmp; 
    } 

    /** 
    * Loads a song 
    * 
    * @param {String} url The url of the song. 
    */ 
    function loadSongWebAudioAPI(url) { 
    var request = new XMLHttpRequest(); 
    var context = new webkitAudioContext(); 

    request.open('GET', url, true); 
    request.responseType = 'arraybuffer'; 

    /** 
    * Appends two ArrayBuffers into a new one. 
    * 
    * @param {ArrayBuffer} data The ArrayBuffer that was loaded. 
    */ 
    function play(data) { 
     // Concatenate the two buffers into one. 
     var a = appendBuffer(data, data); 
     var buffer = a.buffer; 
     var audioSource = context.createBufferSource(); 
     audioSource.connect(context.destination); 

     //decode the loaded data 
     context.decodeAudioData(buffer, function(buf) { 
     console.log('The buffer', buf); 
     audioSource.buffer = buf; 
     audioSource.noteOn(0); 
     audioSource.playbackRate.value = 1; 
     }); 

    }; 

    // When the song is loaded asynchronously try to play it. 
    request.onload = function() { 
     play(request.response); 
    } 

    request.send(); 
    } 


    loadSongWebAudioAPI('http://localhost:8282/loop.mp3'); 
} 

window.addEventListener('load',init,false); 

उत्तर

15

अपने कोड में समस्या यह है कि आप कॉपी कर रहे हैं और खुद के अंत पर एमपी 3 फ़ाइल की एक प्रति संलग्न है। यह प्रतिलिपि डीकोडर द्वारा प्रभावी रूप से अनदेखा हो जाती है - यह कच्चे बफर डेटा नहीं है, यह पूरी तरह से पूर्ण एमपी 3 फ़ाइल के बाद, फ़ाइल स्ट्रीम में केवल यादृच्छिक नकली जंक है।

आपको ऑडियो ऑडियो को ऑडियो ऑडियो में पहले डीकोड करने की आवश्यकता है, फिर ऑडियो बफर को एक नए ऑडियोबफर में एक साथ जोड़ दें। इसके लिए आपके कोड का पुनर्गठन की आवश्यकता है।

यह क्या आप क्या करना चाहते है:

var context = new webkitAudioContext(); 

function init() { 

    /** 
    * Appends two ArrayBuffers into a new one. 
    * 
    * @param {ArrayBuffer} buffer1 The first buffer. 
    * @param {ArrayBuffer} buffer2 The second buffer. 
    */ 
    function appendBuffer(buffer1, buffer2) { 
    var numberOfChannels = Math.min(buffer1.numberOfChannels, buffer2.numberOfChannels); 
    var tmp = context.createBuffer(numberOfChannels, (buffer1.length + buffer2.length), buffer1.sampleRate); 
    for (var i=0; i<numberOfChannels; i++) { 
     var channel = tmp.getChannelData(i); 
     channel.set(buffer1.getChannelData(i), 0); 
     channel.set(buffer2.getChannelData(i), buffer1.length); 
    } 
    return tmp; 
    } 

    /** 
    * Loads a song 
    * 
    * @param {String} url The url of the song. 
    */ 
    function loadSongWebAudioAPI(url) { 
    var request = new XMLHttpRequest(); 

    request.open('GET', url, true); 
    request.responseType = 'arraybuffer'; 

    /** 
    * Appends two ArrayBuffers into a new one. 
    * 
    * @param {ArrayBuffer} data The ArrayBuffer that was loaded. 
    */ 
    function play(data) { 
     //decode the loaded data 
     context.decodeAudioData(data, function(buf) { 
     var audioSource = context.createBufferSource(); 
     audioSource.connect(context.destination); 

     // Concatenate the two buffers into one. 
     audioSource.buffer = appendBuffer(buf, buf); 
     audioSource.noteOn(0); 
     audioSource.playbackRate.value = 1; 
     }); 

    }; 

    // When the song is loaded asynchronously try to play it. 
    request.onload = function() { 
     play(request.response); 
    } 

    request.send(); 
    } 


    loadSongWebAudioAPI('loop.mp3'); 
} 

window.addEventListener('load',init,false); 

वहाँ एक मामूली प्लेबैक खाई है - कि क्योंकि आप अपने ध्वनि नमूना, नहीं की शुरुआत मुद्दों पाशन के कारण पर चुप्पी के लगभग 50ms है है।

आशा है कि इससे मदद मिलती है!

+1

धन्यवाद, आपकी टिप्पणी ने मेरी मदद की! http://72lions.github.com/PlayingChunkedMP3-WebAudioAPI/ – 72lions

+0

@cwilso प्लेबैक के अलग-अलग समय में एकाधिक ऑडियोबफर सॉर्स नोड्स को एक साथ जोड़ना संभव है? –

+0

ठीक है, आप बस उन्हें एक ही गंतव्य से जोड़ सकते हैं। मुझे लगता है कि जिस प्रभाव को आप ढूंढ रहे हैं उसका प्रभाव है। – cwilso

संबंधित मुद्दे