2017-05-20 1 views
-1

Im Bau einer Webapp mit Angular4, die unter anderem Audiodateien abspielen soll. Leider habe ich keine Kontrolle über den Server, der die Mediendateien bereitstellt, und kann daher die Servereinstellungen nicht ändern. Angular Audioplayback ohne CORS

Wenn ich jetzt ein Audio-Element erstellen und direkt spielen, die Audio-Wiedergabe funktioniert wie erwartet:

var audio = new Audio(); 
audio.src = item.url; // the item is simply an object that holds the url and title 
audio.load(); 
audio.play(); 

Wenn ich jetzt eine Spieler-Klasse, die die Wiedergabe-Funktionalität kapselt ich einen CORS Fehler erhalten, da die mp3 Produkte haben nicht die sachgemäßen Header gesetzt:

@Injectable 
export class Player { 
audio: any; 

constructor(private zone: NgZone){ 
    this.initialize(); 
} 

initialize(){ 
    if (!this.audio) { 
     this.audio = new Audio(); 
     this.audio.autoplay.false; 
     this.audio.preload = 'auto'; 
     this.audio.autobuffer = true; 
     this.audio.crossOrigin = "anonymous"; 
    } 
} 

setUrl(url: string) { 
    this.initialize(); 
    this.audio.pause(); 
    this.audio.src = url; 
    this.audio.load(); 
} 

play() { 
    this.audio.play(); 
} 

pause() { 
    this.audio.pause(); 
} 

} 

die Fehlermeldung, die auf Spiel zurückgegeben wird die folgenden Ergebnisse, die im wesentlichen inidactes, dass die CORS Politik aus dem Element verhindert abgespielten:

Uncaught (in promise) DOMException: Failed to load because no supported source was found. 

Gibt es eine Möglichkeit, dies zu umgehen? Und warum funktioniert es, wenn ich das Audioelement direkt im Controller anrufe?

Antwort

0

Grundsätzlich CORS ist eine Begrenzung auferlegt und Controller von den Webbrowsern, die Cross-Source-Inhalte mit AJAX-Anfragen laden oder abrufen, so eine mögliche Lösung ist das Lesen und Streamen der MP3 mit einer serverseitigen Lösung.

Eine Problemumgehung ist zum Beispiel, einen Proxy-Server zu entwickeln, der die MP3-Streams ohne die CORS-Einschränkung weiterleitet. Sie können das zum Beispiel mit NodeJS erreichen.

Sie können einen Proxy erstellen Verwendung für die überall Paket CORS: https://www.npmjs.com/package/cors-anywhere

oder Sie können auch Ihre individuelle Proxy entwickeln und die CORS-Middleware zu verwenden: https://github.com/expressjs/cors

Also die Abhilfe sollte wie folgt aussieht:

In Bezug auf den Grund, warum Ihr erstes Beispiel funktionierte, ist manchmal der Browser "schlau genug", um w zu unterscheiden Wenn ein Inhalt auf faire Weise geladen wird, ohne dass dies Auswirkungen auf die Sicherheit hat, wird die CORS-Richtlinie ignoriert (Weitere Informationen finden Sie unter: https://stackoverflow.com/a/41308074/1641558).