Hoe getrunceerde audio te streamen met MediaSource API
Met de MediaSource API, jij kan genereren en configureren van mediastreams recht in de browser. Hiermee kunt u verschillende bewerkingen uitvoeren op mediadata gehouden door media-gerelateerde HTML-tags zoals of
. U kunt bijvoorbeeld mix verschillende streams, maak overlappende media, luie media laden, en bewerk media-metrieken zoals het volume of de frequentie wijzigen.
In dit bericht zullen we specifiek zien hoe dat moet een audiomonster streamen (een ingekort MP3-bestand) met de MediaSource API recht in de browser om pre-show muziek voor uw publiek. We zullen bespreken hoe ondersteuning voor de API detecteren, hoe verbinding maken met het HTML-media-element naar de API, hoe haal de media op via Ajax, en tot slot hoe stream het.
Als je van tevoren wilt zien wat we van plan zijn, bekijk dan de broncode op Github, of bekijk de demopagina.
Stap 1. Maak de HTML
Om de HTML te maken, voegt u een toe tag met a
controls
attribuut naar uw pagina. Voor achterwaartse compatibiliteit, ook voeg een standaard foutmelding toe voor gebruikers wiens browsers de functie niet ondersteunen. We zullen JavaScript gebruiken om dit bericht in / uit te schakelen.
Stap 2. Detecteer browserondersteuning
Maak in JavaScript een proberen te vangen
blokkeer die wil gooi een fout als het MediaSource API wordt niet ondersteund door de browser van de gebruiker of, met andere woorden, als MediaSource
(de sleutel) bestaat niet in de venster
voorwerp.
probeer if (! 'MediaSource' in venster) nieuwe ReferenceError ('Er is geen MediaSource-eigenschap in het vensterobject.') catch (e) console.log (e);
Stap 3. Detecteer MIME-ondersteuning
Controleer na de supportcontrole ook de ondersteuning van het MIME-type. Als het MIME-type van het medium dat u wilt streamen, niet wordt ondersteund door de browser, waarschuw de gebruiker en gooi een fout.
var mime = 'audio / mpeg'; if (! MediaSource.isTypeSupported (mime)) alert ('Kan de media niet afspelen. Media van MIME-type' + mime + 'wordt niet ondersteund.'); throw ('Media van het type' + mime + 'wordt niet ondersteund.');
Houd er rekening mee dat het bovenstaande codefragment moet zijn geplaatst in de proberen
blok, voor de vangst
blokkeren (volg voor verwijzingen de regelnummering of bekijk het laatste JS-bestand op Github).
Stap 4. Koppel het
tag aan de MediaSource API
Maak een nieuw MediaSource
object en wijs het toe als de bron van de label door de
URL.createObjectURL ()
methode.
var audio = document.querySelector ('audio'), mediaSource = new MediaSource (); audio.src = URL.createObjectURL (mediabron);
Stap 5. Voeg een toe SourceBuffer
bezwaar tegen MediaSource
Wanneer een HTML-media-element toegang tot een mediabron en is er klaar voor creëren SourceBuffer
voorwerpen, de MediaSource API vuurt een sourceopen
evenement .
De SourceBuffer
voorwerp bezit een brok media dat wordt uiteindelijk gedecodeerd, verwerkt en gespeeld. Een MediaSource
object kan hebben meerdere SourceBuffer
voorwerpen.
Binnen in de event handler van de sourceopen
evenement, Voeg een ... toe SourceBuffer
bezwaar tegen MediaSource
met de addSourceBuffer ()
methode.
mediaSource.addEventListener ('sourceopen', function () var sourceBuffer = this.addSourceBuffer (mime););
Stap 6. Haal de media op
Nu dat je een hebt SourceBuffer
object, het is tijd om haal het mp3-bestand op. In ons voorbeeld doen we dit door een AJAX-verzoek gebruiken.
Gebruik arraybuffer
zoals responseType
, welke geeft binaire gegevens aan. Wanneer het antwoord met succes is opgehaald, voeg het toe aan SourceBuffer
met de appendBuffer ()
methode.
mediaSource.addEventListener (sourceopen "functie () var sourceBuffer = this.addSourceBuffer (mime); var XHR = new XMLHttpRequest; xhr.open ( 'GET'," sample.mp3); xhr.responseType = 'arraybuffer' ; xhr.onload = function () try switch (this.status) case 200: sourceBuffer.appendBuffer (this.response); break; geval 404: throw 'Bestand niet gevonden'; default: throw 'Kan de fetch bestand '; catch (e) console.error (e);; xhr.send (););
Stap 7. Geef het einde van de stream aan
Wanneer de API klaar is met het toevoegen van de gegevens aan SourceBuffer
een evenement genoemd updatend
is ontslagen. In een gebeurtenishandler belt u de endOfStream ()
methode van MediaSource
naar geven aan dat de stream is beëindigd.
mediaSource.addEventListener (sourceopen "functie () var sourceBuffer = this.addSourceBuffer (mime); var XHR = new XMLHttpRequest; xhr.open ( 'GET'," sample.mp3); xhr.responseType = 'arraybuffer' ; xhr.onload = function () try switch (this.status) case 200: sourceBuffer.appendBuffer (this.response); sourceBuffer.addEventListener (updateend "functie (_) mediaSource.endOfStream (); ); break; geval 404: throw 'bestand niet gevonden'; default: throw 'Kan het bestand niet te halen'; catch (e) console.error (e);; xhr.send ();) ;
Stap 8. Afkappen van het mediabestand
De SourceBuffer
object heeft twee eigenschappen riep appendWindowStart
en appendWindowEnd
het vertegenwoordigen van de begin- en eindtijd van de mediadata je wilt filteren. De gemarkeerde code hieronder filtert de eerste vier seconden van de MP3.
mediaSource.addEventListener (sourceopen "functie () var sourceBuffer = this.addSourceBuffer (mime); sourceBuffer.appendWindowEnd = 4,0; ...);
demonstratie
En dat is alles, onze audiomonster wordt gestreamd rechtstreeks vanaf de webpagina. Voor de broncode, kijk eens naar onze Github repo en voor het eindresultaat, kijk op de demopagina.
Browserondersteuning
Vanaf het schrijven van dit bericht, de MediaSource
API wordt officieel ondersteund in alle belangrijke browsers. Maar het testen toont aan dat het implementatie is buggy in Firefox, en Webkit-browsers hebben nog steeds problemen met de appendWindowStart
eigendom.
Zoals de MediaSource API is nog in de experimentele fase, de toegang tot hogere bewerkingsfuncties is mogelijk beperkt, maar de standaard streaming functie is iets wat je kunt gebruik meteen.