2013-11-24 7 views
12

Im utilizzando l'API WebAudio con l'oggetto new Audio() come origine. Quanto segue è una versione semplificata di ciò che sto facendo. Questo tuttavia non riproduce alcun suono in firefox 25.0.1.Firefox WebAudio createMediaElementSource non funzionante

var context; 
if(window.webkitAudioContext) { 
    context = new webkitAudioContext(); 
} else { 
    context = new AudioContext(); 
} 
var audio = new Audio(); 

// This file does seem to have CORS Header 
audio.src = "http://upload.wikimedia.org/wikipedia/en/4/45/ACDC_-_Back_In_Black-sample.ogg"; 

var source; 
function onCanPlay() { 
    console.log("can play called"); 
    source = context.createMediaElementSource(audio); 
    source.connect(context.destination); 
    audio.removeEventListener("canplay", onCanPlay); 
    audio.play(); 
} 

if(audio.readyState < 3) { 
    audio.addEventListener("canplay", onCanPlay); 
} else { 
    onCanPlay(); 
} 

jsFiddle: http://jsfiddle.net/7bJUU/

ho letto in un altro question che createMediaElementSource richiede CORS. Il file nell'esempio sopra sembra avere Access-Control-Allow-Origin: * ma ancora non funziona in firefox. Se eseguo lo stesso esempio localmente con un file audio locale, tutto funziona correttamente.

Non sono sicuro se questo è un bug o se sto facendo qualcosa di terribilmente sbagliato. Qualsiasi aiuto è apprezzato.

+0

Questo appare come un bug di Firefox per me. Le intestazioni CORS sono sicuramente lì, e il codice è tutto corretto. –

+0

Sembra un bug https://bugzilla.mozilla.org/show_bug.cgi?id=937718 – z33m

+0

Hmm. Beh, suppongo che tu possa probabilmente usare AJAX come un fermo, dal momento che il file OGG ha un'intestazione CORS. In bocca al lupo. –

risposta

3

Ecco perché:

  1. Firefox (testato prima e dopo l'aggiornamento a 41.0.1 a partire dal 7 Ottobre 2015) sembra avere qualche problema con non protetti incrociati domini sul sicuro socket HTTP. Ho aggiornato a https: su sorgente multimediale, poiché Wikimedia ha un protocollo 443 TCP alternativo con un certificato valido rilasciato a "Wikimedia Foundation, Inc." dal 23 giugno 2015 fino al 19 febbraio 2017, da CA "GlobalSign". Quando su un dominio sicuro, i browser sono utilizzati anche per richiedere risorse sicure.
  2. L'elemento DOM audio e altri elementi come Immagine e Video hanno la proprietà "crossOrigin", che specifica di fornire credenziali (cookie) o meno. L'incrociato anonimo specifica che non ci sarà scambio di cookie di domini per il dominio incrociato, che è considerato sicuro dal browser. Quindi, ho impostato "audio.crossOrigin" su "anonymous" prima di specificare la fonte audio.

ho testato su Firefox (come detto al primo articolo) e Chrome 45.0.2454.101m, e ha funzionato bene, e così ho aggiornato sulle JSFiddle: https://jsfiddle.net/7bJUU/11/7bJUU

+0

Solo una nota per gli altri che puoi anche usare l'attributo 'crossorigin' sull'elemento audio direttamente come' '. –