Render en MP3 Audio Spectrum i Flash Med computeSpectrum ()
Del
Del
6
Share
Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
I denne opplæringen, vil jeg lære deg hvordan å lage en visuell representasjon av en lydfil er lydspekteret, ved hjelp av Flash er SoundMixer.computeSpectrum metode. Vi vil bruke fire klasser for denne effekten: Sound, SoundChannel, SoundMixer, og ByteArray. Jeg skal forklare hver klasser som vi bruker dem
Endelig resultat Forhåndsvisning
La oss ta en titt på det endelige resultatet vi skal jobbe mot.
Klikk for å se demo
Trinn 1: Sett opp din Flash File
Launch Flash Pro og opprette en ny Flash-dokument. Satt scenen størrelse 500x300px, bakgrunnsfargen til # 000000, og bildefrekvensen til 24fps.
I tidslinjen din, velg eksisterende lag og endre navnet «Knapper». Deretter klikker du Vindu > Vanlige Bibliotekene > Knapper Velg din favoritt knapp sett, og dra og slipp 'Play "og" stopp "knappene til nederste høyre hjørne av scenen. Sett eksempel navnene på disse knapper til play_btn Hotell og stop_btn Opprett en ny AS-fil, og lagre den som < em> Main.as Denne koden skal plasseres i vår nye klasse: Du må sette en MP3-fil som heter sound.mp3 Legg til klassenavnet til Class-feltet i Publish delen av panelet Egenskaper for å knytte FLA med hoveddokumentet klasse. Hvis du ikke er kjent med konseptet av et dokument klasse, sjekk ut denne Quick Tips før du leser videre. Deretter trykker Ctrl + Enter for å teste programmet. La oss legge til en forekomst av en ny klasse: SoundChannel. Denne klassen brukes til å holde forskjellige lyder i separate lydkanaler; hver kanal er skapt av en forekomst av SoundChannel, og vi bruker disse tilfellene til å kontrollere lydene Som du ser, når Play er klikket, har vi ikke bare spille MP3, vi også tilordne den til en SoundChannel. Vi kan da styre avspillingen gjennom denne SoundChannel eksempel senere - i dette tilfellet, ved å gjøre det stoppe Nå la oss lage noen enkle animasjon for dette. høres, igjen ved hjelp av SoundChannel klassen De leftPeak og rightPeak egenskapene til en SoundChannel eksempel tilsvare dagens amplitude av lyden, gjennom venstre og høyre kanal. Tenk på det på denne måten: Hvis du har stereohøyttalere, så leftPeak er volumet på lyden som kommer ut av venstre høyttaler, og rightPeak er volumet på lyden som kommer ut av høyre høyttaler Du kan. trykk Ctrl + Enter for å teste applikasjonen: De SoundMixer klassen kontrollerer all innebygde og streaming lyder i programmet, for alle SoundChannels samtidig. Den har tre metoder: areSoundsInaccessible (), som avgjør om noen lyder er utilgjengelige på grunn av sikkerhetsmessige årsaker; STOPALL (), som stopper avspilling av alle lyder; og computeSpectrum (), som er det vi er interessert i for denne opplæringen. Den siste metoden tar et "øyeblikksbilde" av den aktuelle lyden, og skyver det inn i en ByteArray objekt ByteArray klassen inneholder metoder og egenskaper å optimalisere lesing, skriving, og jobber med binære data. Den lagrer data som en matrise av bytes, derav navnet. Finn ut mer med dette Introduksjon til ByteArray Så nå la oss skape en mer kompleks animasjon bruker SoundMixer.computeSpectrum () -metoden. Igjen, lese kommentarene i koden for å fullt ut forstå oppførselen: De viktigste delene av denne koden er linjene 53 og 57. Her, hele lydbølge er oversatt til en ByteArray, som deretter lese, byte for byte, og oversatt til et sett med tall. ByteArray vil være 512 flyter lenge; i for loop, vi bare lese de første 256 flyter, som tilsvarer hele lydbølge av venstre kanal (lyden kommer gjennom venstre høyttaler). Trykk Ctrl + Enter for å teste programmet. Vi kan fylle i området under linjen for å gi oss en annen effekt: Alt vi trenger å gjøre er å trekke en boks og fyll det ut, ved hjelp av grafikkmetoder. Koden for dette er som følger: Vi kan ta denne ideen videre, for å legge enda mer interessant og komplekse effekter: I dette tilfellet, vil vi Tegn to spektra oppå hverandre, en for venstre kanal og en til høyre. For å oppnå dette, vil vi bruke to for løkker som hver leser i 256 flyter, den ene etter den andre Så vi har lært å bruke de ulike Sound klasser, og hvordan du kan lage vakre lyden tegning animasjoner ved hjelp SoundMixer. Takk for at du tok deg tid til å lese denne artikkelen, fordi dette er min første opplæringen. Hvis du har spørsmål, kan du la dem i en kommentar.
.
henholdsvis
Trinn 2:. Opprett dokument Class
. Legg denne koden (les kommentarene for mer informasjon):
pakke {import flash.display.Sprite; import flash.media.Sound; //The Sound klasse er første skritt i å jobbe med lyd. Den brukes til å laste inn en lyd, spille av en lyd, og administrere grunnleggende lyd egenskaper. import flash.net.URLRequest; public class Hoved strekker Sprite {private Div lyd: Sound; offentlig funksjon main () {sound = new Sound (ny URLRequest ("sound.mp3")); //tildele musikk til lyden variabel. sound.play (); //spille tildelt lyd. }}}
i samme katalog som FLA utgang katalogen. MP3 vil gjøre; på inngår i opplæringen kilde nedlasting
Trinn 3:. Dokument Class
Trinn 4: Håndtering av Sound Bruke Knapper
pakke {import flash.display.Sprite.; import flash.media.Sound; import flash.media.SoundChannel; import flash.net.URLRequest; import flash.events.MouseEvent; public class Hoved strekker Sprite {private Div lyd: Sound; private Var kanal: SoundChannel; offentlig funksjon main () {sound = new Sound (ny URLRequest ("sound.mp3")); play_btn.addEventListener (MouseEvent.CLICK, onPlayHandler); stop_btn.addEventListener (MouseEvent.CLICK, onStopHandler); } Private funksjon onPlayHandler (event: MouseEvent): void {kanal = sound.play (); } Private funksjon onStopHandler (event: MouseEvent): void {channel.stop (); }}}
Trinn 5: Lag enkel animasjon
pakke {import flash.display.Sprite.; import flash.media.Sound; import flash.media.SoundChannel; import flash.net.URLRequest; import flash.events.MouseEvent; import flash.events.Event; public class Hoved strekker Sprite {private Div lyd: Sound; private Var kanal: SoundChannel; offentlig funksjon main () {sound = new Sound (ny URLRequest ("sound.mp3")); play_btn.addEventListener (MouseEvent.CLICK, onPlayHandler); stop_btn.addEventListener (MouseEvent.CLICK, onStopHandler); } Private funksjon onPlayHandler (event: MouseEvent): void {kanal = sound.play (); //tildele lyd til kanal klasse addEventListener (Event.ENTER_FRAME, animateBars); //gjengi animasjon hver ramme} privat funksjon onStopHandler (event: MouseEvent): void {channel.stop (); graphics.clear (); removeEventListener (Event.ENTER_FRAME, animateBars); //stoppe rende animasjonen} private funksjons animateBars (event: Aktivitet): void {graphics.clear (); graphics.beginFill (0xAB300C, 1); //Tegn et rektangel hvis høyde tilsvarer channel.leftPeak graphics.drawRect (190,300,50, -channel.leftPeak * 160); graphics.endFill (); graphics.beginFill (0xAB300C, 1); //Tegn et rektangel hvis høyde tilsvarer channel.rightPeak graphics.drawRect (250,300,50, -channel.rightPeak * 160); graphics.endFill (); }}}
Trinn 6: Hva er SoundMixer
Trinn 7:.? Hva er ByteArray
Trinn 8:. Mer Complex Animasjon
pakke {import flash.display.Sprite; import flash.media.Sound; import flash.utils.ByteArray; import flash.events.Event; import flash.media.SoundMixer; import flash.filters.GlowFilter; import flash.net.URLRequest; import flash.events.MouseEvent; import flash.media.SoundChannel; public class Hoved strekker Sprite {private Div lyd: Sound; private Var kanal: SoundChannel; private Var byteArr: ByteArray = new ByteArray (); private Var glød: GlowFilter = new GlowFilter (); private Var filterArr: Array; private Var linje: Sprite = new Sprite (); offentlig funksjon main () {//lage en "glow" effekt for animasjonen vi vil gjengi glow.color = 0x009900; glow.alpha = 1; glow.blurX = 10; glow.blurY = 10; //Laste MP3 inn til Sound objektet lyden = new Sound (ny URLRequest ("sound.mp3")); //Gjelder gløden effekt filterArr = new Array (glow); line.filters = filterArr; addChild (linje); play_btn.addEventListener (MouseEvent.CLICK, onPlayHandler); stop_btn.addEventListener (MouseEvent.CLICK, onStopHandler); } Private funksjon onPlayHandler (event: MouseEvent): void {kanal = sound.play (0,1000); addEventListener (Event.ENTER_FRAME, spectrumHandler); } Private funksjon onStopHandler (event: MouseEvent): void {channel.stop (); line.graphics.clear (); removeEventListener (Event.ENTER_FRAME, spectrumHandler); } Private funksjon spectrumHandler (hendelse: Hendelse): void {line.graphics.clear (); line.graphics.lineStyle (1, Math.random () * 0xFFFFFF); line.graphics.moveTo (-1150); //Presse spekteret er byte inn i ByteArray SoundMixer.computeSpectrum (byteArr); for (var i: uint = 0; i < 256; i ++) {//lese bytes og oversette til et tall mellom 0 og 300 Var num: Number = byteArr.readFloat () * 150 + 150; //bruke dette nummeret til å tegne en linje line.graphics.lineTo (i * 2, num); }}}}
Trinn 9: fylle ut hullene
pakke {import flash.display.Sprite; import flash.media.Sound; import flash.utils.ByteArray; import flash.events.Event; import flash.media.SoundMixer; import flash.filters.GlowFilter; import flash.net.URLRequest; import flash.events.MouseEvent; import flash.media.SoundChannel; public class Hoved strekker Sprite {private Div lyd: Sound; private Var kanal: SoundChannel; private Var byteArr: ByteArray = new ByteArray (); private Var glød: GlowFilter = new GlowFilter (); private Var filterArr: Array; private Var linje: Sprite = new Sprite (); offentlig funksjon main () {glow.color = 0xff0000; glow.alpha = 1; glow.blurX = 10; glow.blurY = 10; høres = new Sound (ny URLRequest ("sound.mp3")); filterArr = new Array (glow); line.filters = filterArr; addChild (linje); addChild (play_btn); addChild (stop_btn); play_btn.addEventListener (MouseEvent.CLICK, onPlayHandler); stop_btn.addEventListener (MouseEvent.CLICK, onStopHandler); } Private funksjon onPlayHandler (event: MouseEvent): void {kanal = sound.play (0,1000); addEventListener (Event.ENTER_FRAME, spectrumHandler); } Private funksjon onStopHandler (event: MouseEvent): void {channel.stop (); line.graphics.clear (); removeEventListener (Event.ENTER_FRAME, spectrumHandler); } Private funksjon spectrumHandler (hendelse: Hendelse): void {//trekke den ene kanten av sekstenmeteren, og angi en fill line.graphics.clear (); line.graphics.beginFill (0xFF0000,1); line.graphics.lineStyle (1,0xFF0000); line.graphics.moveTo (-1150); SoundMixer.computeSpectrum (byteArr); for (var i: uint = 0; i < 256; i ++) {var num: Number = byteArr.readFloat () * 200 + 150; line.graphics.lineTo (i * 2, num); } //Trekke resten av boksen line.graphics.lineTo (512 300); line.graphics.lineTo (0300); line.graphics.lineTo (-1150); }}}
Trinn 10: Prøv noe annet
pakke {import flash.display.Sprite.; import flash.media.Sound; import flash.utils.ByteArray; import flash.events.Event; import flash.media.SoundMixer; import flash.filters.GlowFilter; import flash.net.URLRequest; import flash.events.MouseEvent; import flash.media.SoundChannel; public class Hoved strekker Sprite {private Div lyd: Sound; private Var kanal: SoundChannel; private Var byteArr: ByteArray = new ByteArray (); private Var glød: GlowFilter = new GlowFilter (); private Var filterArr: Array; private Var linje: Sprite = new Sprite (); private Var num: Number; offentlig konst GRAFT_HEIGHT: int = 150; //satt animasjon høyde offentlig konst CHANNEL_SIZE: int = 256; //sett venstre /høyre kanal størrelse offentlig funksjon main () {glow.color = 0x009900; glow.alpha = 1; glow.blurX = 10; glow.blurY = 10; høres = new Sound (ny URLRequest ("sound.mp3")); filterArr = new Array (glow); //legger glød til animasjons line.filters = filterArr; addChild (linje); play_btn.addEventListener (MouseEvent.CLICK, onPlayHandler); stop_btn.addEventListener (MouseEvent.CLICK, onStopHandler); } Private funksjon onPlayHandler (event: MouseEvent): void {kanal = sound.play (0,1000); //Spille av lyd tusen ganger addEventListener (Event.ENTER_FRAME, spectrumHandler); } Private funksjon onStopHandler (event: MouseEvent): void {channel.stop (); line.graphics.clear (); removeEventListener (Event.ENTER_FRAME, spectrumHandler); } Private funksjon spectrumHandler (hendelse: Hendelse): void {num = 0; line.graphics.clear (); //Oppretter dagens grafikk line.graphics.lineStyle (0, 0x00FF00); line.graphics.beginFill (0x00FF00,0.5); line.graphics.moveTo (0, GRAFT_HEIGHT); SoundMixer.computeSpectrum (byteArr); //legge bytes til Sound mixer for (var i: int = 0; i < CHANNEL_SIZE; i ++) {num = (byteArr.readFloat () * GRAFT_HEIGHT); line.graphics.lineTo (i * 2, GRAFT_HEIGHT - num); } Line.graphics.lineTo (CHANNEL_SIZE * 2, GRAFT_HEIGHT); line.graphics.endFill (); line.graphics.lineStyle (0, 0xff0000); line.graphics.beginFill (0xff0000, 0,5); line.graphics.moveTo (CHANNEL_SIZE * 2, GRAFT_HEIGHT); for (i = CHANNEL_SIZE; i > 0; I--) {num = (byteArr.readFloat () * GRAFT_HEIGHT); line.graphics.lineTo (i * 2, GRAFT_HEIGHT - num); } Line.graphics.lineTo (0, GRAFT_HEIGHT); line.graphics.endFill (); }}}
Konklusjon