Signatur
Beschreibung
Die Eigenschaft sourceBuffer eines AudioTrack-Objekts verweist auf den SourceBuffer der Media Source Extensions (MSE), aus dem die Audiospur stammt. Fügt man einem SourceBuffer über appendBuffer() ein Initialisierungssegment hinzu, legt der Browser dafür passende AudioTrack-Objekte an. Diese erscheinen sowohl in SourceBuffer.audioTracks als auch in HTMLMediaElement.audioTracks.
Die Eigenschaft ist null, wenn die Spur nicht aus einem SourceBuffer stammt, etwa bei einer normalen Datei über src. Sie ist ebenfalls null, wenn der zugehörige SourceBuffer mit MediaSource.removeSourceBuffer() aus seiner MediaSource entfernt wurde.
Nützlich ist die Eigenschaft beim adaptiven Streaming mit mehreren Puffern, zum Beispiel wenn es für jede Sprache einen eigenen Puffer gibt. Man kann damit von einer Spur des Medienelements auf den Puffer schließen, der sie liefert, und dort Daten nachladen, entfernen oder den Pufferstand prüfen.
Rückgabewert
SourceBuffer, der die Spur erzeugt hat, oder null, wenn die Spur nicht aus MSE stammt oder der Puffer entfernt wurde.Beispiele
Prüfen, ob eine Audiospur aus MSE stammt
const video = document.querySelector('video');
// audioTracks wird nicht überall unterstützt
if (video.audioTracks) {
for (const track of video.audioTracks) {
const herkunft = track.sourceBuffer ? 'MSE-SourceBuffer' : 'normale Quelle';
console.log(`${track.label || track.id} (${track.language}): ${herkunft}`);
}
} else {
console.log('AudioTrackList wird nicht unterstützt');
}
Zur aktiven Spur den Puffer ermitteln und seinen Füllstand anzeigen
const video = document.querySelector('video');
const zeigePufferStand = () => {
const aktiv = [...(video.audioTracks ?? [])].find((t) => t.enabled);
const sb = aktiv?.sourceBuffer;
if (!sb) {
console.log('Aktive Spur hat keinen SourceBuffer');
return;
}
const { buffered } = sb;
for (let i = 0; i < buffered.length; i++) {
console.log(`Bereich ${i}: ${buffered.start(i).toFixed(1)}s – ${buffered.end(i).toFixed(1)}s`);
}
};
video.audioTracks?.addEventListener('change', zeigePufferStand);
Die Referenz wird nach removeSourceBuffer() zu null
const video = document.querySelector('video');
const mediaSource = new MediaSource();
video.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', async () => {
const sb = mediaSource.addSourceBuffer('audio/mp4; codecs="mp4a.40.2"');
const init = await (await fetch('/media/audio-init.mp4')).arrayBuffer();
sb.appendBuffer(init);
sb.addEventListener('updateend', () => {
const track = sb.audioTracks?.[0];
console.log(track?.sourceBuffer === sb); // true
mediaSource.removeSourceBuffer(sb);
console.log(track?.sourceBuffer); // null
}, { once: true });
});
// Wichtig · Fallstricke
- Browser-Unterstützung:
HTMLMediaElement.audioTracksund damitAudioTrackwerden kaum unterstützt. Safari unterstützt sie. In Chrome muss man experimentelle Web-Plattform-Funktionen aktivieren, in Firefox ist ein Konfigurationsschalter nötig. Deshalb vor der Nutzung immer mitvideo.audioTracks?.prüfen. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird still ignoriert, im Strict Mode wirft sie einen
TypeError. - Bei normalen Quellen über
srcoder<source>ist der Wert immernull. Einnullbedeutet also nicht automatisch einen Fehler. - Nach
MediaSource.removeSourceBuffer()wird der Wertnull. Wer die Referenz vorher in einer Variablen gespeichert hat, arbeitet danach mit einem entfernten Puffer. Weitere Aufrufe wieappendBuffer()werfen dann einenInvalidStateError. - Unter iOS-Safari, wo nur
ManagedMediaSourceverfügbar ist, kann das Verhalten abweichen. Bitte auf echten Geräten testen.