Hjemmeside » Coding » Sådan streams afkortet lyd ved hjælp af MediaSource API

    Sådan streams afkortet lyd ved hjælp af MediaSource API

    Med MediaSource API, du kan generere og konfigurere mediestrømme lige i browseren. Det giver dig mulighed for udføre en række operationer på mediedata indeholdt af medie-relaterede HTML-tags som f.eks eller . For eksempel kan du bland forskellige streams, skabe overlappende medier, dovne belastningsmedier, og rediger medie beregninger som f.eks. ændre lydstyrken eller frekvensen.

    I dette indlæg vil vi specifikt se hvordan stream en lydprøve (en afkortet MP3-fil) med MediaSource API lige i browseren for at kunne pre-show musik til dit publikum. Vi vil dække hvordan opdage støtte til API'en, hvordan Tilslut HTML-medieelementet til API, hvordan hent medierne via Ajax, og endelig hvordan stream det.

    Hvis du gerne vil se på forhånd, hvad vi skal gøre, så tag et kig på kildekode på Github, eller tjek den demo side.

    Trin 1. Opret HTML

    For at oprette HTML, tilføj en tag med a kontroller attribut til din side. Til bagudkompatibilitet, også Tilføj en standard fejlmeddelelse for brugere, hvis browsere ikke understøtter funktionen. Vi vil bruge JavaScript til at tænde / slukke denne besked.

      

    Trin 2. Opdag browserens support

    I JavaScript opretter du en prøv ... fange blokere det vil kaste en fejl hvis MediaSource API understøttes ikke af brugerens browser eller med andre ord hvis MediaSource (nøglen) eksisterer ikke i vindue objekt.

     prøv if (! 'MediaSource' i vinduet) kaste nye ReferenceError ('Der er ingen MediaSource-egenskab i vinduesobjekt.') catch (e) console.log (e);  

    Trin 3. Opdag MIME-support

    Efter supportkontrol skal du også tjekke for understøttelse af MIME-typen. Hvis MIME-typen af ​​det medie, du vil streame, ikke understøttes af browseren, advarsel brugeren og kaste en fejl.

    var mime = 'audio / mpeg'; hvis (! MediaSource.isTypeSupported (mime)) alert ('Kan ikke afspille medier. Media of MIME type' + mime + 'understøttes ikke.'); kaste ('Media of type' + mime + 'understøttes ikke.');  

    Bemærk at kodestykket ovenfor skal være placeret inde i prøve blok, før fangst blok (til reference, følg linjenummeringen eller tjek den endelige JS-fil på Github).

    Trin 4. Link den tag til MediaSource API

    Opret en ny MediaSource objekt og tildele det som kilde til tag ved at bruge URL.createObjectURL () metode.

     var audio = document.querySelector ('audio'), mediaSource = ny MediaSource (); audio.src = URL.createObjectURL (mediaSource); 

    Trin 5. Tilføj en SourceBuffer protestere mod MediaSource

    Når et HTML-medieelement adgang til en mediekilde og er klar til skab SourceBuffer objekter, MediaSource API brænder a sourceopen begivenhed .

    Det SourceBuffer objekt har en masse medier det bliver til sidst afkodet, behandlet og spillet. En enkelt MediaSource objekt kan har flere SourceBuffer objekter.

    Inde i event handlinger af sourceopen begivenhed, Tilføj en SourceBuffer protestere mod MediaSource med addSourceBuffer () metode.

     mediaSource.addEventListener ('sourceopen', funktion () var sourceBuffer = this.addSourceBuffer (mime);); 

    Trin 6. Hent medierne

    Nu hvor du har en SourceBuffer objekt, det er tid til hent MP3-filen. I vores eksempel gør vi det ved ved hjælp af en AJAX-anmodning.

    Brug arraybuffer som responseType, hvilken betegner binære data. Når svaret hentes, tilføj det til SourceBuffer med appendBuffer () metode.

     mediaSource.addEventListener ('sourceopen', funktion () var sourceBuffer = this.addSourceBuffer (mime); var xhr = ny XMLHttpRequest; xhr.open ('GET', 'sample.mp3'); xhr.responseType = 'arraybuffer' ; xhr.onload = function () prøv switch (this.status) case 200: sourceBuffer.appendBuffer (this.response); break; case 404: kaste 'Fil ikke fundet'; default: throw 'Kunne ikke hente fil '; fangst (e) console.error (e);; xhr.send ();); 

    Trin 7. Angiv slutningen af ​​strømmen

    Når API'en er færdig med at tilføje data til SourceBuffer en begivenhed kaldet updatend er fyret. Indenfor en begivenhedshandler skal du ringe til endOfStream () metode til MediaSource til Angiv, at strømmen er afsluttet.

     mediaSource.addEventListener ('sourceopen', funktion () var sourceBuffer = this.addSourceBuffer (mime); var xhr = ny XMLHttpRequest; xhr.open ('GET', 'sample.mp3'); xhr.responseType = 'arraybuffer' ; xhr.onload = function () prøv switch (this.status) sag 200: sourceBuffer.appendBuffer (this.response); sourceBuffer.addEventListener ('updateend', funktion (_) mediaSource.endOfStream (); ); break; case 404: kaste 'File not Found'; default: kaste 'Kunne ikke hente filen'; catch (e) console.error (e);; xhr.send ();) ; 

    Trin 8. Afkort mediefilen

    Det SourceBuffer objekt har to egenskaber hedder appendWindowStart og appendWindowEnd repræsenterer start og sluttid for mediedataene du vil filtrere. Den fremhævede kode nedenfor filtrerer de første fire sekunder af MP3.

     mediaSource.addEventListener ('sourceopen', funktion () var sourceBuffer = this.addSourceBuffer (mime); sourceBuffer.appendWindowEnd = 4.0; ...); 

    Demo

    Og det er alt, vores lydprøve streames lige fra websiden. For kildekode, kig på vores Github repo og for det endelige resultat, tjek den demo side.

    Browser support

    Som ved at skrive dette indlæg, den MediaSource API understøttes officielt i alle større browsere. Men testen viser, at implementering er buggy i Firefox, og webkit browsere har stadig problemer med appendWindowStart ejendom.

    Som MediaSource API er stadig i sin eksperimentelle fase, adgang til højere redigeringsfunktioner kan være begrænset, men grundlæggende streaming funktion er noget du kan gøre brug af med det samme.