API Media Source: assicura automaticamente una riproduzione senza interruzioni dei segmenti multimediali in ordine di aggiunta

Gli elementi audio e video HTML ti consentono di caricare, decodificare e riprodurre contenuti multimediali semplicemente fornendo un URL di origine:

    <video src='foo.webm'></video>

Questo approccio funziona bene in casi d'uso semplici, ma per tecniche come lo streaming adattivo, l'API Media Source Extensions (MSE) offre un maggiore controllo. MSE consente di creare stream in JavaScript a partire da segmenti di audio o video.

Puoi provare MSE all'indirizzo simpl.info/mse:

Screenshot del video riprodotto utilizzando l&#39;API MSE.

Il codice riportato di seguito è tratto da questo esempio.

Un MediaSource rappresenta un'origine di contenuti multimediali per un elemento audio o video. Una volta creato un oggetto MediaSource e attivato il relativo evento open, è possibile aggiungere SourceBuffer. Questi elementi fungono da buffer per i segmenti multimediali:

var mediaSource = new MediaSource();
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function() {
    var sourceBuffer =
        mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');
    // Get video segments and append them to sourceBuffer.
}

I segmenti multimediali vengono "trasmessi in streaming" a un elemento audio o video aggiungendo ogni segmento a un SourceBuffer con appendBuffer(). In questo esempio, il video viene recuperato dal server e poi archiviato utilizzando le API File:

reader.onload = function (e) {
    sourceBuffer.appendBuffer(new Uint8Array(e.target.result));
    if (i === NUM_CHUNKS - 1) {
    mediaSource.endOfStream();
    } else {
    if (video.paused) {
        // start playing after first chunk is appended
        video.play();
    }
    readChunk(++i);
    }
};

Impostazione dell'ordine di riproduzione

Chrome 50 aggiunge ulteriore supporto all'attributo SourceBuffer mode, consentendo di specificare che i segmenti multimediali vengano riprodotti in modo continuo, nell'ordine in cui sono stati aggiunti, indipendentemente dal fatto che i segmenti multimediali avessero inizialmente timestamp discontinui.

Utilizza l'attributo mode per specificare l'ordine di riproduzione dei segmenti multimediali. Può avere uno dei due valori:

  • segments: il timestamp di ogni segmento (che potrebbe essere stato modificato da timestampOffset) determina l'ordine di riproduzione, indipendentemente dall'ordine in cui i segmenti vengono aggiunti.
  • Sequenza: l'ordine dei segmenti inseriti nel buffer nella sequenza temporale multimediale è determinato dall'ordine con cui i segmenti vengono aggiunti a SourceBuffer.

Se i segmenti multimediali hanno timestamp analizzati dai dati dello stream di byte quando vengono aggiunti a SourceBuffer, la proprietà mode di SourceBuffer verrà impostata su segmenti. In caso contrario, mode verrà impostato su sequenza. Tieni presente che i timestamp non sono facoltativi: devono essere presenti per la maggior parte dei tipi di stream e non possono essere presenti per altri: i timestamp in-band sono innati nei tipi di stream che li contengono.

L'impostazione dell'attributo mode è facoltativa. Per gli stream che non contengono timestamp (audio/mpeg e audio/aac) mode può essere modificato solo da segmenti a sequenza: verrà generato un errore se cerchi di modificare mode da sequenza a segmenti. Per gli stream con timestamp, è possibile passare da segmenti a sequenza, anche se in pratica questo potrebbe produrre un comportamento indesiderato, difficile da comprendere o da prevedere.

Per tutti i tipi di stream, puoi modificare il valore da segmenti a sequenza. Ciò significa che i segmenti verranno riprodotti nell'ordine in cui sono stati aggiunti e verranno generati nuovi timestamp di conseguenza:

sourceBuffer.mode = 'sequence';

La possibilità di impostare il valore mode su sequence garantisce la riproduzione continua dei contenuti multimediali, indipendentemente dal fatto che i timestamp dei segmenti multimediali siano discontinui, ad esempio se si sono verificati problemi con il muxing del video o se (per qualsiasi motivo) vengono aggiunti segmenti discontinui. È possibile che un'app esegui il polyfill con timestampOffset per garantire la riproduzione continua, se sono disponibili metadati dello stream corretti, ma la modalità sequence semplifica la procedura e riduce la possibilità di errori.

App e demo MSE

Questi mostrano MSE in azione, ma senza manipolazione di SourceBuffer.mode:

Supporto browser

  • Chrome 50 e versioni successive per impostazione predefinita
  • Per Firefox, vedi MDN per i dettagli

Specifica

Informazioni sull'API