2015-03-24 26 views
5

Próbuję załadować i odtwarzać plik audio w Chrome pomyślnie, ale nie mogę go odtworzyć wstecz:Odtwarzanie audio z tyłu 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() 

ta nie wytwarza dźwięk i tylko jeden timeupdate zdarzenia wypalania.

+2

Wygląda na to, że tutaj znajdują się sprzeczne informacje. [Ta strona] (https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/WebAudio_playbackRate_explained) (na dole) stwierdza, że ​​"Wartości ujemne nie odtwarzają obecnie mediów do tyłu", jednak [ Dokumenty HTMLMediaElement] (https://developer.mozilla.org/en/docs/Web/API/HTMLMediaElement) mówią: "Jeśli wartość playbackRate jest ujemna, nośnik odtwarzany jest wstecz" – CodingIntrigue

+0

Ta specyfikacja nie została jeszcze zaimplementowana przez większość przeglądarki? –

+0

Wygląda na to. Istnieje "obejście" tutaj: http://stackoverflow.com/questions/16045812/jquery-why-the-rewind-playbackrate-doesnt-work – CodingIntrigue

Odpowiedz

6

Użycie wartości ujemnych nie jest obecnie obsługiwane, więc będziesz musiał ręcznie załadować i odwrócić bufory.

Należy pamiętać, że będzie to wymagać źródła dźwięku z włączoną funkcją CORS (w przykładzie nie ma, więc nie można skonfigurować demonstracji na żywo). Oto jeden ze sposobów to:

  • ładowania danych za pośrednictwem AJAX (wymaga CORS włączone do pliku audio)
  • Niech przeglądarka analizowania bufor do bufora dźwięku
  • Get bufor kanału (s) (referencje)
  • Rewers bufor (y)
  • zainicjować bufora dźwięku i odegrania

będzie to oczywiście ogranicza się trochę jak nie można użyj już elementu Audio. Będziesz musiał obsługiwać żądane funkcje, ręcznie dodając do nich kontrolki i kod.

// 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)} 
} 
Powiązane problemy