2015-03-24 5 views
5

मैं लोड और क्रोम में एक ऑडियो फ़ाइल को सफलतापूर्वक चलाने के लिए कोशिश कर रहा हूँ के साथ पीछे की ओर ऑडियो बजाना, लेकिन मैं इसे पीछे की ओर नहीं खेल सकते:HTMLMediaElement

 audio = new Audio('http://mathweirdo.com/bingo/audio/buzzer.mp3'); 
     audio.playbackRate = -1; 
     audio.currentTime = audio.duration; // I have tried ommiting this line 
     audio.play() 

यह कोई आवाज और केवल एक ही timeupdate घटना फायरिंग पैदा करता है।

+2

लगता है कि यहां विरोधाभासी जानकारी है। [यह पृष्ठ] (https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/WebAudio_playbackRate_explained) (नीचे) कहता है कि 'नकारात्मक मान वर्तमान में मीडिया को पीछे नहीं चलाते हैं', हालांकि [ HTMLMediaElement दस्तावेज़] (https://developer.mozilla.org/en/docs/Web/API/HTMLMediaElement) कहता है, 'यदि प्लेबैक रेट नकारात्मक है, तो मीडिया पीछे की ओर खेला जाता है' – CodingIntrigue

+0

तो क्या यह कल्पना अभी तक सबसे अधिक लागू नहीं हुई है ब्राउज़रों? –

+0

ऐसा लगता है कि। यहां एक "वर्कअराउंड" है: http://stackoverflow.com/questions/16045812/jquery-why-the-rewind-playbackrate-doesnt-work – CodingIntrigue

उत्तर

6

नकारात्मक मानों का उपयोग वर्तमान में समर्थित नहीं है, इसलिए आपको बफर को मैन्युअल रूप से लोड और रिवर्स करना होगा।

ध्यान दें कि इसके लिए सीओआरएस सक्षम ऑडियो स्रोत की आवश्यकता होगी (उदाहरण में कोई नहीं है, इसलिए मैं लाइव डेमो सेट नहीं कर सका)। यहाँ ऐसा करने का एक तरीका है:

  • लोड AJAX के माध्यम से डेटा
  • ब्राउज़र एक ऑडियो बफर
  • में बफर पार्स करते हैं (इस ऑडियो फाइल के लिए CORS सक्षम की आवश्यकता है) चैनल बफर जाओ (रों) (संदर्भ)
  • बफर (रों)
  • ऑडियो बफर प्रारंभ और

खेलने निश्चित रूप से हो जाएगा ताकि आप कुछ सीमित कर रिवर्स के रूप में आप नहीं कर सकते अब ऑडियो तत्व का प्रयोग करें। मैन्युअल रूप से उनके लिए नियंत्रण और कोड जोड़कर आपको इच्छित सुविधाओं का समर्थन करना होगा।

// load audio as a raw array buffer: 
fetch("http://mathweirdo.com/bingo/audio/buzzer.mp3", process); 

// then process the buffer using decoder 
function process(file) { 
    var actx = new (window.AudioContext || window.webkitAudioContext); 
    actx.decodeAudioData(file, function(buffer) { 

     var src = actx.createBufferSource(),  // enable using loaded data as source 
      channel, tmp, i, t = 0, len, len2; 

     // reverse channels 
     while(t < buffer.numberOfChannels) {  // iterate each channel 
     channel = buffer.getChannelData(t++); // get reference to a channel 
     len = channel.length - 1;    // end of buffer 
     len2 = len >>> 1;      // center of buffer (integer) 
     for(i = 0; i < len2; i++) {    // loop to center 
      tmp = channel[len - i];    // from end -> tmp 
      channel[len - i] = channel[i];  // end = from beginning 
      channel[i] = tmp;     // tmp -> beginning 
     } 
     } 

     // play 
     src.buffer = buffer; 
     src.connect(actx.destination); 
     if (!src.start) src.start = src.noteOn; 
     src.start(0); 
    }, 
    function() {alert("Could not decode audio!")} 
) 
} 

// ajax loader 
function fetch(url, callback) { 
    var xhr = new XMLHttpRequest(); 
    try { 
    xhr.open("GET", url); 
    xhr.responseType = "arraybuffer"; 
    xhr.onerror = function() {alert("Network error")}; 
    xhr.onload = function() { 
     if (xhr.status === 200) callback(xhr.response); 
     else alert(xhr.statusText); 
    }; 
    xhr.send(); 
    } catch (err) {alert(err.message)} 
}