Signatur
Beschreibung
Die Eigenschaft BlobEvent.data liefert das Blob-Objekt, das zu einem BlobEvent gehört. In der Praxis begegnet man ihr fast ausschließlich im dataavailable-Ereignis eines MediaRecorder: Jedes Mal, wenn der Recorder Mediendaten bereitstellt, enthält event.data einen Teil (Chunk) der Aufnahme bzw. die gesamte Aufnahme.
Wann ein dataavailable-Ereignis ausgelöst wird, hängt vom Aufruf ab:
recorder.start()ohne Argument: ein einziges Blob beim Aufruf vonstop().recorder.start(timeslice): regelmäßig alletimesliceMillisekunden ein Chunk – ideal für Streaming oder Hochladen in Teilen.recorder.requestData(): sofortige Ausgabe der bisher gepufferten Daten.
Üblicherweise sammelt man die einzelnen Blobs in einem Array und setzt sie nach dem stop-Ereignis mit new Blob(chunks, { type }) zu einer abspielbaren oder herunterladbaren Datei zusammen. Der MIME-Typ des Blobs entspricht dem Format des Recorders (z. B. video/webm oder audio/mp4) und ist über event.data.type abrufbar.
Rückgabewert
Blob mit den (Teil-)Mediendaten. Kann eine size von 0 haben, wenn keine Daten vorlagen.Beispiele
Mikrofonaufnahme sammeln und abspielen
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream);
const chunks = [];
recorder.addEventListener('dataavailable', (event) => {
// Leere Chunks ignorieren
if (event.data.size > 0) chunks.push(event.data);
});
recorder.addEventListener('stop', () => {
const blob = new Blob(chunks, { type: recorder.mimeType });
const audio = new Audio(URL.createObjectURL(blob));
audio.controls = true;
document.body.append(audio);
console.log(`Aufnahme: ${blob.size} Bytes, Typ ${blob.type}`);
});
recorder.start();
setTimeout(() => recorder.stop(), 3000);
Bildschirmaufnahme in Chunks hochladen (timeslice)
const stream = await navigator.mediaDevices.getDisplayMedia({ video: true });
const recorder = new MediaRecorder(stream, { mimeType: 'video/webm' });
let index = 0;
recorder.ondataavailable = async ({ data }) => {
if (!data.size) return;
const form = new FormData();
form.append('chunk', data, `teil-${index++}.webm`);
await fetch('/upload', { method: 'POST', body: form });
};
// Alle 2 Sekunden ein neues BlobEvent mit data
recorder.start(2000);
BlobEvent manuell erzeugen
const blob = new Blob(['Hallo Welt'], { type: 'text/plain' });
const event = new BlobEvent('dataavailable', { data: blob, timecode: 0 });
console.log(event.data === blob);
console.log(await event.data.text());
// Wichtig · Fallstricke
- Schreibgeschützt:
event.datakann nicht neu zugewiesen werden; der Wert wird ausschließlich über den Konstruktor (new BlobEvent(type, { data })) oder den Browser gesetzt. Dasdata-Feld ist im Konstruktor Pflicht. - Einzelne Chunks sind oft nicht eigenständig abspielbar: Nur der erste Chunk enthält bei WebM/MP4 die Container-Header. Chunks daher in der richtigen Reihenfolge zusammenfügen.
- Leere Blobs: Ein Chunk kann
size === 0haben – vor dem Speichern prüfen. - Letzter Chunk: Beim Aufruf von
stop()wird zuerst ein finalesdataavailableund erst danachstopausgelöst. Die Datei also erst imstop-Handler zusammensetzen. - Speicher: Mit
URL.createObjectURL()erzeugte URLs perURL.revokeObjectURL()wieder freigeben, sonst bleibt das Blob im Speicher. - Kompatibilität: In allen modernen Browsern verfügbar; Safari unterstützt
MediaRecorderseit Version 14.1 und liefert bevorzugtaudio/mp4/video/mp4statt WebM. Unterstützte Formate mitMediaRecorder.isTypeSupported()prüfen.getUserMediaerfordert einen sicheren Kontext (HTTPS).