Signatur
Beschreibung
Ein MediaError-Objekt beschreibt, warum ein HTMLMediaElement (also <audio> oder <video>) eine Medienquelle nicht laden, dekodieren oder abspielen konnte. Du erzeugst es nicht selbst. Der Browser legt es in der Eigenschaft HTMLMediaElement.error ab und löst dann das Ereignis error am Medienelement aus. Solange kein Fehler aufgetreten ist, hat element.error den Wert null.
Die Schnittstelle hat zwei schreibgeschützte Eigenschaften:
code: ein numerischer Fehlercode (unsigned short), der einer der folgenden Konstanten entspricht:MediaError.MEDIA_ERR_ABORTED(1): Der Abruf wurde abgebrochen, meist auf Wunsch des Nutzers.MediaError.MEDIA_ERR_NETWORK(2): Ein Netzwerkfehler hat den Download unterbrochen, nachdem die Quelle schon als nutzbar erkannt war.MediaError.MEDIA_ERR_DECODE(3): Beim Dekodieren ist ein Fehler aufgetreten, zum Beispiel wegen beschädigter Daten.MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED(4): Die Quelle ist ungeeignet, etwa bei nicht unterstütztem Format oder Codec, falscher URL, Fehler 404 oder CORS-Blockade.
message: eine Zeichenkette mit Diagnosedetails, die vom Browser abhängen. Sie kann leer sein.
Nutze MediaError, um in eigenen Mediaplayern verständliche Fehlermeldungen anzuzeigen, auf eine andere Quelle umzuschalten (Fallback) oder Wiedergabeprobleme an ein Monitoring zu melden. Vergleiche code dabei am besten mit den benannten Konstanten und nicht mit festen Zahlen.
Rückgabewert
HTMLMediaElement.error gelesen. Das ist ein MediaError-Objekt mit code und message oder null, wenn kein Fehler aufgetreten ist.Beispiele
Fehler eines Videos per addEventListener auswerten
const video = document.querySelector('video');
const beschreibeFehler = (err) => {
switch (err.code) {
case MediaError.MEDIA_ERR_ABORTED:
return 'Wiedergabe wurde abgebrochen.';
case MediaError.MEDIA_ERR_NETWORK:
return 'Netzwerkfehler beim Laden des Videos.';
case MediaError.MEDIA_ERR_DECODE:
return 'Das Video ist beschädigt oder nicht dekodierbar.';
case MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED:
return 'Format nicht unterstützt oder Datei nicht gefunden.';
default:
return 'Unbekannter Medienfehler.';
}
};
video.addEventListener('error', () => {
const err = video.error;
console.error(`Code ${err.code}: ${beschreibeFehler(err)}`, err.message);
});
video.src = '/videos/gibt-es-nicht.mp4';
Automatischer Fallback auf eine alternative Quelle
const audio = new Audio();
const quellen = ['/audio/podcast.opus', '/audio/podcast.mp3'];
let index = 0;
audio.onerror = () => {
const { code, message } = audio.error;
console.warn(`Quelle ${quellen[index]} fehlgeschlagen (Code ${code})`, message);
if (code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED && index < quellen.length - 1) {
index += 1;
audio.src = quellen[index]; // nächste Quelle versuchen
} else {
audio.onerror = null; // Handler entfernen, keine weiteren Versuche
console.error('Keine abspielbare Quelle gefunden.');
}
};
audio.src = quellen[index];
Medienfehler an ein Monitoring melden und Listener entfernen
const video = document.querySelector('#player');
const melde = async () => {
const err = video.error;
if (!err) return;
await fetch('/api/log', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
src: video.currentSrc,
code: err.code,
message: err.message || '(keine Details)'
})
});
video.removeEventListener('error', melde);
};
video.addEventListener('error', melde);
// Wichtig · Fallstricke
- Fehler bei
<source>-Kindelementen: Hat das Medienelement mehrere<source>-Elemente, löst jede fehlgeschlagene Quelle daserror-Ereignis am jeweiligen<source>-Element aus.video.errorbleibt dabei zunächstnull. Um sie abzufangen, registriere den Listener am letzten<source>-Element oder mituseCaptuream Medienelement. messageist nicht standardisiert: Inhalt und Format hängen vom Browser ab, und die Zeichenkette kann leer sein. Verwende sie nur zur Diagnose, nicht für Programmlogik oder als Text für Nutzer.- Code 4 umfasst viele Ursachen: Nicht unterstützter Codec, HTTP 404 und CORS-Blockaden (etwa bei
crossoriginohne passende Header) ergeben alleMEDIA_ERR_SRC_NOT_SUPPORTED. Aus Sicherheitsgründen verrät der Browser keine Details zu fremden Ursprüngen. - Abgelehnte
play()-Aufrufe: Wenn die Autoplay-Richtlinie greift, wird das Promise vonplay()mit einerDOMException(NotAllowedError) abgelehnt. Es entsteht dann keinMediaError. - Das veraltete
MEDIA_ERR_ENCRYPTED(Code 5) aus frühen EME-Entwürfen ist nicht mehr Teil der Spezifikation. Nutze bei verschlüsselten Medien die Ereignisse der Encrypted Media Extensions. - Kompatibilität:
codeund die Konstanten funktionieren in allen Browsern.messagegibt es erst in neueren Versionen (Safari erst ab 15).