Registra audio e video con MediaRecorder

Sprendi champagne e ciambelle! La funzionalità di Chrome più speciale di sempre è stata implementata.

Immagina un registratore delle piste da sci che sincronizza i video con i dati di GeoLocation, una semplicissima app di promemoria vocali o un widget che ti consente di registrare un video e caricarlo su YouTube, il tutto senza plug-in.

L'API MediaRecorder ti consente di registrare audio e video da un'app web. Al momento è disponibile in Firefox e in Chrome per Android e computer.

Fai una prova qui.

Screenshot della demo di mediaRecorder su Android Nexus 5X

L'API è semplice e lo dimostrerò usando il codice della demo del repository di esempio WebRTC. Tieni presente che l'API può essere utilizzata solo da origini sicure: HTTPS o localhost.

Per prima cosa, crea un'istanza di MediaRecorder con MediaStream. Facoltativamente, utilizza un parametro options per specificare il formato di output desiderato:

var options = {mimeType: 'video/webm; codecs=vp9'};
mediaRecorder = new MediaRecorder(stream, options);

Il MediaStream può provenire da:

  • Una chiamata getUserMedia().
  • Il destinatario di una chiamata WebRTC.
  • Una registrazione dello schermo.
  • Web Audio, una volta implementato questo problema.

Per options è possibile specificare il tipo MIME e, in futuro, le velocità in bit audio e video.

I tipi MIME hanno valori più o meno specifici e combinano container e codec. Ad esempio:

  • audio/webm
  • video/webm
  • video/webm;codecs=vp8
  • video/webm;codecs=vp9

Utilizza il metodo statico MediaRecorder.isTypeSupported() per verificare se un tipo MIME è supportato, ad esempio quando crei un'istanza di MediaRecorder:

var options;
if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9')) {
    options = {mimeType: 'video/webm; codecs=vp9'};
} else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8')) {
    options = {mimeType: 'video/webm; codecs=vp8'};
} else {
    // ...
}

L'elenco completo dei tipi MIME supportati da MediaRecorder in Chrome è disponibile qui.

Poi, aggiungi un gestore dati e chiama il metodo start() per iniziare la registrazione:

var recordedChunks = [];

var options = {mimeType: 'video/webm;codecs=vp9'};
mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.ondataavailable = handleDataAvailable;
mediaRecorder.start();

function handleDataAvailable(event) {
    if (event.data.size > 0) {
    recordedChunks.push(event.data);
    } else {
    // ...
    }
}

In questo esempio viene aggiunto un BLOB all'array recordedChunks ogni volta che i dati diventano disponibili. Al metodo start() è possibile assegnare facoltativamente un argomento timeSlice che specifica la lunghezza dei contenuti multimediali da acquisire per ogni BLOB.

Quando hai finito di registrare, comunica a MediaRecorder:

mediaRecorder.stop();

Riproduci i BLOB registrati in un elemento video creando un "super-Blob" dall'array di BLOB registrati:

function play() {
    var superBuffer = new Blob(recordedChunks);
    videoElement.src =
    window.URL.createObjectURL(superBuffer);
}

In alternativa, puoi eseguire il caricamento su un server tramite XHR o utilizzare un'API come YouTube (consulta la demo sperimentale di seguito).

Il download può essere eseguito con la compromissione di alcuni link:

function download() {
    var blob = new Blob(recordedChunks, {
    type: 'video/webm'
    });
    var url = URL.createObjectURL(blob);
    var a = document.createElement('a');
    document.body.appendChild(a);
    a.style = 'display: none';
    a.href = url;
    a.download = 'test.webm';
    a.click();
    window.URL.revokeObjectURL(url);
}

Feedback sulle API e demo

La possibilità di registrare audio e video senza plug-in è relativamente nuova nelle app web, pertanto apprezziamo in particolare il tuo feedback sulle API.

Vorremmo inoltre sapere quali sono gli scenari di utilizzo più importanti per te e a quali funzionalità vorresti che diamo la priorità. Commenta questo articolo o monitora i progressi all'indirizzo crbug.com/262211.

Demo

App

  • L'app Memos vocali di Paul Lewis ora supporta MediaRecorder, con polyfill per i browser che non supportano l'audio MediaRecorder.

Polyfill

  • MediaStreamRecorder di Muaz Khan è una libreria JavaScript per la registrazione di audio e video, compatibile con MediaRecorder.
  • Recorderjs consente la registrazione da un nodo API Web Audio. Puoi vedere questa funzionalità nell'app Memo vocali di Paul Lewis.

Supporto del browser

  • Chrome 49 e versioni successive per impostazione predefinita
  • Chrome desktop 47 e 48 con funzionalità della piattaforma web sperimentale attivata da chrome://flags
  • Firefox dalla versione 25
  • Edge: "In corso di considerazione"

Specifiche

w3c.github.io/mediacapture-record/MediaRecorder.html

Informazioni sull'API

developer.mozilla.org/en/docs/Web/API/MediaRecorder_API