Neem audio en video op met MediaRecorder

Haal de champagne en de donuts tevoorschijn! De Chrome-functie met de meeste sterren OOIT is nu geïmplementeerd.

Stel je een skipisterecorder voor die video synchroniseert met GeoLocation-gegevens, of een supereenvoudige spraakmemo-app, of een widget waarmee je een video kunt opnemen en deze naar YouTube kunt uploaden - allemaal zonder plug-ins.

Met de MediaRecorder API kunt u audio en video opnemen vanaf een webapp. Het is nu beschikbaar in Firefox en in Chrome voor Android en desktop.

Probeer het hier eens.

Screenshot van mediaRecorder-demo op Android Nexus 5X

De API is eenvoudig, wat ik zal demonstreren met behulp van code uit de WebRTC-voorbeeldrepository demo . Houd er rekening mee dat de API alleen vanaf een veilige oorsprong kan worden gebruikt: HTTPS of localhost.

Maak eerst een MediaRecorder met een MediaStream. Gebruik optioneel een options om het gewenste uitvoerformaat op te geven:

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

De MediaStream kan afkomstig zijn van:

  • Een getUserMedia() -aanroep.
  • De ontvangende kant van een WebRTC-oproep.
  • Een schermopname.
  • Webaudio, zodra dit probleem is geïmplementeerd.

Voor options is het mogelijk om het MIME-type en, in de toekomst, audio- en videobitrates op te geven.

MIME-typen hebben min of meer specifieke waarden, waarbij container en codecs worden gecombineerd. Bijvoorbeeld:

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

Gebruik de statische methode MediaRecorder.isTypeSupported() om te controleren of een MIME-type wordt ondersteund, bijvoorbeeld wanneer u MediaRecorder instantieert:

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 {
    // ...
}

De volledige lijst met MIME-typen die door MediaRecorder in Chrome worden ondersteund, is hier beschikbaar.

Voeg vervolgens een gegevenshandler toe en roep de methode start() aan om de opname te starten:

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 dit voor beeld wordt een BLOB toegevoegd aan de array recordedChunks wanneer er gegevens beschikbaar komen. De methode start() kan optioneel een timeSlice argument krijgen dat de lengte van de media specificeert die voor elke Blob moet worden vastgelegd.

Wanneer u klaar bent met opnemen, vertelt u de MediaRecorder:

mediaRecorder.stop();

Speel de opgenomen Blobs af in een video-element door een 'super-Blob' te maken uit de reeks opgenomen Blobs:

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

Als alternatief kunt u via XHR naar een server uploaden of een API zoals YouTube gebruiken (zie de experimentele demo hieronder).

Downloaden kan worden bereikt met wat link-hacking:

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 over de API's en demo's

De mogelijkheid om audio en video op te nemen zonder plug-ins is relatief nieuw voor webapps, dus we stellen uw feedback over de API's bijzonder op prijs.

We willen ook graag weten welke gebruiksscenario's voor u het belangrijkst zijn en aan welke functies u prioriteit wilt geven. Reageer op dit artikel of volg de voortgang op crbug.com/262211 .

Demo's

Apps

  • De Voice Memos- app van Paul Lewis heeft nu MediaRecorder-ondersteuning, polyfilled voor browsers die MediaRecorder-audio niet ondersteunen.

Polyvullingen

  • Muaz Khan's MediaStreamRecorder is een JavaScript-bibliotheek voor het opnemen van audio en video, compatibel met MediaRecorder.
  • Recorderjs maakt opnemen mogelijk vanaf een Web Audio API-knooppunt. Je kunt dit in actie zien in de Voice Memos- app van Paul Lewis.

Browser-ondersteuning

  • Standaard Chrome 49 en hoger
  • Chrome-desktop 47 en 48 met experimentele webplatformfuncties ingeschakeld via chrome://flags
  • Firefox vanaf versie 25
  • Rand : 'In overweging'

Spec

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

API-informatie

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