16/03/2025
I en verden, hvor digitalt indhold er konge, er evnen til at fange og genbruge medier direkte fra din webbrowser mere værdifuld end nogensinde. Dette er præcis, hvad MediaStream Recording API muliggør. Ofte omtalt som Media Recording API eller MediaRecorder API, er det et kraftfuldt værktøj, der er tæt forbundet med Media Capture and Streams API og WebRTC API. Dets primære formål er at give udviklere mulighed for at fange data genereret af et MediaStream-objekt eller et HTMLMediaElement (som f.eks. et <audio> eller <video> element) med henblik på analyse, videre behandling eller lagring på disk. Det mest bemærkelsesværdige er, at det er overraskende ligetil at arbejde med, hvilket åbner op for en verden af muligheder for interaktive webapplikationer.

Selvom visse dele af denne funktionalitet kan have varierende grad af understøttelse på tværs af platforme, er MediaStream Recording API generelt veletableret og fungerer på mange enheder og browserversioner. Faktisk har det været bredt tilgængeligt på tværs af de fleste moderne browsere siden april 2021, hvilket cementerer dets position som en pålidelig og tilgængelig teknologi for webudviklere.
Kernekoncepter og Anvendelse af MediaStream Recording API
MediaStream Recording API er centreret omkring én enkelt, men yderst vigtig, grænseflade: MediaRecorder. Det er dette objekt, der udfører alt arbejdet med at tage data fra en MediaStream og levere det til dig til videre behandling. Dataene leveres i en serie af dataavailable-begivenheder, og de er allerede i det format, du specificerer, når du opretter MediaRecorder-instansen. Dette giver dig den fleksibilitet, du har brug for, til at behandle dataene yderligere, f.eks. ved at filtrere dem, eller blot skrive dem direkte til en fil, som du ønsker.
Optagelsesprocessen Trin for Trin
Processen med at optage en stream er bemærkelsesværdigt enkel og kan opdeles i nogle få logiske trin:
- Opsætning af Mediekilden: Først skal du definere din mediekilde. Dette kan enten være et
MediaStream-objekt, som typisk kommer fra en mikrofon, et kamera eller en skærmoptagelse, eller etHTMLMediaElementi form af et<audio>- eller<video>-element, der afspiller indhold. - Oprettelse af
MediaRecorder-objektet: Dernæst opretter du etMediaRecorder-objekt. Her specificerer du kildestreamen og eventuelle ønskede indstillinger. Disse indstillinger kan omfatte containerens MIME-type (f.eks.'video/webm'eller'audio/ogg') og de ønskede bitrater for dens spor. Valget af MIME-type er afgørende, da det bestemmer formatet for de optagede data. - Indstilling af
ondataavailable-begivenhedshåndterer: Du skal derefter indstille en begivenhedshåndterer fordataavailable-begivenheden. Denne funktion vil blive kaldt, hver gang der er nye data tilgængelige for dig at arbejde med. Hver gang denne håndterer udløses, vil den modtage enBlob, der indeholder de seneste mediebytes. - Start af Optagelse: Når kildemediet afspilles, og du er klar til at begynde optagelsen, kalder du blot
MediaRecorder.start()-metoden for at starte optagelsen. Du kan også angive et tidsinterval i millisekunder som et argument tilstart(), hvis du ønsker at modtage data i mindre bidder med jævne mellemrum. - Håndtering af Indsamlede Data: Din
dataavailable-begivenhedshåndterer bliver kaldt, hver gang der er data klar til dig at gøre med, som du vil. Begivenheden har etdata-attribut, hvis værdi er enBlob, der indeholder mediedataene. Du kan derefter behandle disseBlob'er yderligere, f.eks. ved at tilføje dem til en array, eller skrive dem direkte til en fil. Det er også muligt at tvinge endataavailable-begivenhed til at forekomme ved at kaldeMediaRecorder.requestData(), hvilket leverer de seneste data til dig, så du kan filtrere, gemme eller hvad end du ønsker. - Stop af Optagelse: Optagelsen stopper automatisk, når kildemediet stopper med at afspille. Du kan dog også stoppe optagelsen manuelt til enhver tid ved at kalde
MediaRecorder.stop()-metoden. Det er vigtigt at bemærke, at individuelleBlob-objekter, der indeholder dele af de optagede medier, ikke nødvendigvis kan afspilles individuelt. Mediet skal samles igen, typisk til én storBlob, før det kan afspilles korrekt. - Fejlhåndtering: Hvis der opstår problemer under optagelsen, sendes en
error-begivenhed tilMediaRecorder-objektet. Du kan lytte efter disse fejl ved at opsætte enonerror-begivenhedshåndterer, hvilket er afgørende for robust applikationsudvikling.
Et Praktisk Eksempel: Optagelse fra et HTML Canvas
For at illustrere, hvor nemt det er at bruge MediaStream Recording API, lad os se på et eksempel, hvor vi optager indhold fra et HTML <canvas>-element og gemmer det som en WebM-video. Dette eksempel viser, hvordan man fanger en stream fra et canvas, optager den i 9 sekunder og derefter downloader den.
const canvas = document.querySelector("canvas"); // Fang en stream fra canvas med 25 billeder per sekund. const stream = canvas.captureStream(25); const recordedChunks = []; console.log(stream); // Definer indstillinger for optageren, her med WebM og VP9 codec. const options = { mimeType: "video/webm; codecs=vp9" }; // Opret en ny MediaRecorder-instans med streamen og de definerede indstillinger. const mediaRecorder = new MediaRecorder(stream, options); // Definer begivenhedshåndtereren for 'dataavailable'. mediaRecorder.ondataavailable = handleDataAvailable; // Start optagelsen. mediaRecorder.start(); function handleDataAvailable(event) { console.log("data-available"); // Tjek om der er data og at dataens størrelse er større end nul. if (event.data.size > 0) { // Tilføj den nye Blob med data til vores array af optagede bidder. recordedChunks.push(event.data); console.log(recordedChunks); // Kald download-funktionen for at gemme filen, når alle bidder er samlet. download(); } else { // Håndter tilfælde hvor event.data er tom (ikke relevant i dette eksempel, men god praksis). // … } } function download() { // Opret en enkelt Blob ud fra alle de optagede bidder. const blob = new Blob(recordedChunks, { type: "video/webm" }); // Opret en midlertidig URL til Bloben. const url = URL.createObjectURL(blob); // Opret et usynligt 'a'-element (link) for at udløse download. const a = document.createElement("a"); document.body.appendChild(a); a.style = "display: none"; a.href = url; a.download = "test.webm"; // Filnavn for download. a.click(); // Simuler et klik på linket for at starte download. // Frigiv den midlertidige URL for at frigøre hukommelse. URL.revokeObjectURL(url); } // Demo: Stop optagelsen efter 9 sekunder. setTimeout((event) => { console.log("stopping"); mediaRecorder.stop(); }, 9000); Dette eksempel demonstrerer hele workflowet: fra at fange en stream til at optage og til sidst downloade den færdige fil. canvas.captureStream(25) fanger indholdet af canvas'et som en mediestream med 25 billeder i sekundet. recordedChunks-arrayet bruges til at opsamle de små Blob-bidder, der kommer ind via dataavailable-begivenhederne. Når optagelsen stopper (her efter 9 sekunder via setTimeout), samles alle Blob-bidderne til én stor Blob, som derefter omdannes til en downloadbar fil via en midlertidig URL.
Kontrol og Status for Optageren
Ud over at starte og stoppe optagelsen kan du også bruge egenskaberne for MediaRecorder-objektet til at bestemme optagelsesprocessens aktuelle tilstand. Dette kan være nyttigt for at vise brugeren, om optagelsen er aktiv, pauset eller stoppet. MediaRecorder tilbyder også pause()- og resume()-metoder, som giver dig mulighed for at sætte optagelsen på pause og derefter genoptage den, hvilket giver en mere fleksibel brugeroplevelse.
En anden vigtig funktionalitet er muligheden for at kontrollere, om en specifik MIME-type understøttes af browseren til optagelse. Dette er muligt ved at kalde MediaRecorder.isTypeSupported()-metoden. Dette er afgørende for at sikre kompatibilitet og tilbyde brugeren de mest optimale optagelsesformater baseret på deres browsers muligheder. Hvis du f.eks. vil vide, om video/webm; codecs=vp9 understøttes, kan du kalde MediaRecorder.isTypeSupported('video/webm; codecs=vp9'), som vil returnere true eller false.
Metoder i MediaRecorder-objektet
Her er en oversigt over de vigtigste metoder, du vil bruge med MediaRecorder:
| Metode | Beskrivelse |
|---|---|
start() | Starter optagelsen af mediestreamen. Kan tage et valgfrit tidsinterval i millisekunder. |
stop() | Stopper optagelsen. Udløser en dataavailable-begivenhed med de sidste data og derefter en stop-begivenhed. |
pause() | Pauser optagelsen. |
resume() | Genoptager en pauset optagelse. |
isTypeSupported(type) | En statisk metode, der tjekker om en specifik MIME-type understøttes af browseren til optagelse. |
Identifikation af Potentielle Inputkilder
Hvis dit mål er at optage input fra kamera og/eller mikrofon, kan det være en god idé at undersøge de tilgængelige inputenheder, før du begynder processen med at konstruere MediaRecorder. For at gøre dette skal du kalde navigator.mediaDevices.enumerateDevices() for at få en liste over de tilgængelige medieenheder. Du kan derefter undersøge den liste og identificere potentielle inputkilder og endda filtrere listen baseret på ønskede kriterier, f.eks. kun at vise lydenheder eller videokameraer.
Følgende kodeeksempel viser, hvordan enumerateDevices() bruges til at undersøge de tilgængelige inputenheder, finde dem, der er lydinputenheder, og oprette <option>-elementer, der derefter tilføjes til et <select>-element, der repræsenterer en inputkildevælger:
navigator.mediaDevices.enumerateDevices().then((devices) => { devices.forEach((device) => { const menu = document.getElementById("input-devices"); // Tjek om enheden er en lydinputenhed. if (device.kind === "audioinput") { const item = document.createElement("option"); item.textContent = device.label; // Vis enhedens navn til brugeren. item.value = device.deviceId; // Gem enhedens ID som værdi. menu.appendChild(item); // Tilføj elementet til dropdown-menuen. } }); }); Kode, der ligner dette, kan bruges til at lade brugeren begrænse de enheder, de ønsker at bruge, hvilket giver en høj grad af brugertilpasning og kontrol over optagelsesprocessen.
Vigtige Grænseflader i MediaStream Recording API'en
Ud over MediaRecorder er der et par andre grænseflader, der er centrale for API'ens funktionalitet:
BlobEvent: Hver gang en 'bid' af mediedata er færdig med at blive optaget, leveres den til forbrugere iBlob-form ved hjælp af enBlobEventaf typendataavailable. Dette event-objekt indeholder den faktiske mediedata i sindata-egenskab.MediaRecorder: Den primære grænseflade, der implementerer MediaStream Recording API. Dette er objektet, du interagerer med for at starte, stoppe, pause og genoptage optagelser samt kontrollere status og understøttede formater.MediaRecorderErrorEvent(Forældet/Ikke-standard): Denne grænseflade repræsenterer fejl, der er kastet af MediaStream Recording API. Denserror-egenskab er enDOMException, der specificerer den fejl, der opstod. Selvom den er forældet, er det vigtigt at være opmærksom på fejlhåndtering viaonerror-begivenhedshåndtereren.
Ofte Stillede Spørgsmål om MediaStream Recording API
Hvad kan jeg optage med MediaStream Recording API?
Du kan optage indhold fra en række forskellige kilder, herunder en brugers mikrofon (lydinput), kamera (videoinput), skærmdeling (video af skærmindhold), eller endda indhold, der afspilles i et HTML <audio> eller <video> element. Derudover kan du, som vist i eksemplet, optage dynamisk genereret indhold fra et HTML <canvas> element, hvilket åbner op for optagelse af spil, animationer eller interaktive visualiseringer.
Hvilke filformater understøttes af API'en?
Understøttede filformater (MIME-typer) varierer afhængigt af browseren og dens codecs. Almindelige formater inkluderer dog ofte WebM (med VP8, VP9, Opus, Vorbis codecs) og nogle gange MP4 (med H.264, AAC codecs). Du kan altid tjekke, om en specifik MIME-type understøttes i brugerens browser ved hjælp af MediaRecorder.isTypeSupported('din/mime-type').
Er de individuelle datablokke (Blobs) spilbare?
Nej, de individuelle Blob-objekter, der leveres via dataavailable-begivenheder, er typisk ikke spilbare alene. De repræsenterer 'bidder' af data, der skal samles. For at få en afspilningsbar fil skal alle disse Blob-bidder samles til én stor Blob, som derefter kan gemmes eller afspilles.
Hvordan gemmer jeg den optagede fil?
Efter at have samlet alle de optagede Blob-bidder til en enkelt Blob, kan du gemme den ved at oprette en midlertidig URL til denne Blob ved hjælp af URL.createObjectURL(). Derefter kan du oprette et usynligt <a> (link) element, indstille dets href til denne URL og dets download-attribut til det ønskede filnavn. Ved at simulere et klik på dette link (a.click()) kan du udløse en download i browseren. Husk at kalde URL.revokeObjectURL() efter download for at frigøre ressourcer.
Er det sikkert at bruge MediaStream Recording API?
Ja, brugen af MediaStream Recording API er sikker. For at optage fra en brugers mikrofon, kamera eller skærm kræves der altid eksplicit samtykke fra brugeren. Browseren vil vise en prompt, der beder om tilladelse, før den giver adgang til disse enheder. Dette sikrer, at brugerens privatliv respekteres, og at optagelse kun sker med deres viden og accept.
MediaStream Recording API er et fundamentalt værktøj for moderne webapplikationer, der kræver medieoptagelsesfunktionalitet. Med dets intuitive grænseflade og brede understøttelse kan udviklere nemt integrere robuste optagelsesløsninger direkte i browseren, hvilket giver brugerne mulighed for at skabe og dele indhold som aldrig før. Fra simple lydoptagere til komplekse skærmdelingsværktøjer er mulighederne nærmest uendelige.
Hvis du vil læse andre artikler, der ligner Mediastream Recording API: Fang Dit Indhold Nemt, kan du besøge kategorien Teknologi.
