Onbewerkte geluidsgegevens opvragen

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

Met de methode SoundMixer.computeSpectrum() wordt een toepassing in staat gesteld de onbewerkte geluidsgegevens voor de momenteel afgespeelde geluidsgolf te lezen. Als er momenteel meer dan één object SoundChannel wordt afgespeeld, worden met de methode SoundMixer.computeSpectrum() de gecombineerde geluidsgegevens van alle objecten SoundChannel samen weergegeven.

De geluidsgegevens worden geretourneerd als een object ByteArray met 512 bytes aan gegevens, die elk een zwevende-kommawaarde tussen -1 en 1 bevatten. Deze waarden vertegenwoordigen de amplitude van de punten in de geluidsvorm die wordt afgespeeld. De waarden worden in twee groepen van 256 aangeleverd: de eerste groep heeft betrekking op het linkerstereokanaal en de tweede groep heeft betrekking op het rechterstereokanaal.

De methode SoundMixer.computeSpectrum() retourneert frequentiespectrumgegevens in plaats van golfgegevens als de parameter FFTMode op true is ingesteld. Het frequentiespectrum laat amplitude gesorteerd op geluidsfrequentie zien, beginnen met de laatste frequentie. Er wordt een FFT-transformatie (Fast Fourier Transform) gebruikt om de golfgegevens in frequentiespectrumgegevens om te zetten. De resulterende frequentiespectrumwaarden variëren van 0 tot ongeveer 1,414 (de vierkantswortel van 2).

In het volgende diagram wordt een vergelijking gemaakt tussen enerzijds de door de methode computeSpectrum() geretourneerde gegevens waarvoor de parameter FFTMode is ingesteld op true en anderzijds de door deze methode geretourneerde gegevens waarvoor deze parameter is ingesteld op false . Het geluid waarvan de gegevens voor dit diagram zijn gebruikt, bevat een hard basgeluid in het linkerkanaal en een trommelgeluid in het rechterkanaal.
Afbeelding op volledige grootte weergeven
Waarden geretourneerd door methode SoundMixer.computeSpectrum()
A.
fftMode = true

B.
fftMode = false

De methode computeSpectrum() kan ook gegevens retourneren die opnieuw zijn bemonsterd met een lagere bitsnelheid. Dit leidt in het algemeen tot meer vloeiende golfgegevens of frequentiegegevens, wat ten koste gaat van het detailniveau. De parameter stretchFactor bestuurt de frequentie waarmee de methode computeSpectrum() gegevens bemonstert. Wanneer de parameter stretchFactor op 0 is ingesteld (de standaardwaarde), worden de geluidsgegevens bemonsterd met een frequentie van 44,1 kHz. De frequentie wordt bij elke volgende waarde van de parameter stretchFactor gehalveerd, wat betekent dat een waarde van 1 met een frequentie van 22,05 kHz correspondeert, dat een waarde van 2 met een frequentie van 11,025 kHz correspondeert, enzovoort. De methode computeSpectrum() blijft 256 bytes per stereokanaal retourneren wanneer er een hogere waarde voor stretchFactor wordt gebruikt.

De methode SoundMixer.computeSpectrum() kent een aantal beperkingen:

  • Aangezien geluidsgegevens uit een microfoon of RTMP-streams het algemene object SoundMixer niet passeren, retourneert de methode SoundMixer.computeSpectrum() geen gegevens uit dergelijke bronnen.

  • Als een of meer van de geluiden die worden afgespeeld, afkomstig zijn uit bronnen buiten de huidige inhoudssandbox, zorgen beveiligingsbeperkingen ervoor dat de methode SoundMixer.computeSpectrum() een fout genereert. Zie Beveiligingsoverwegingen bij het laden en afspelen van geluiden en Geladen media benaderen als gegevens voor meer informatie over de beveiligingsbeperkingen van de methode SoundMixer.computeSpectrum() .

In een AIR-toepassing wordt de inhoud in de beveiligingssandbox van de toepassing (inhoud die met de AIR-toepassing is geïnstalleerd) echter niet beperkt door deze beveiligingsbeperkingen.

Een eenvoudig geluidsweergavesysteem maken

In het volgende voorbeeld wordt de methode SoundMixer.computeSpectrum() gebruikt om een grafiek van de geluidsgolf te tekenen die als animatie bij elk frame wordt weergegeven:

import flash.display.Graphics; 
import flash.events.Event; 
import flash.media.Sound; 
import flash.media.SoundChannel; 
import flash.media.SoundMixer; 
import flash.net.URLRequest; 
 
const PLOT_HEIGHT:int = 200; 
const CHANNEL_LENGTH:int = 256; 
 
var snd:Sound = new Sound(); 
var req:URLRequest = new URLRequest("bigSound.mp3"); 
snd.load(req); 
 
var channel:SoundChannel; 
channel = snd.play(); 
addEventListener(Event.ENTER_FRAME, onEnterFrame); 
snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
 
var bytes:ByteArray = new ByteArray(); 
 
function onEnterFrame(event:Event):void 
{ 
    SoundMixer.computeSpectrum(bytes, false, 0); 
     
    var g:Graphics = this.graphics; 
     
    g.clear(); 
    g.lineStyle(0, 0x6600CC); 
    g.beginFill(0x6600CC); 
    g.moveTo(0, PLOT_HEIGHT); 
     
    var n:Number = 0; 
         
    // left channel 
    for (var i:int = 0; i < CHANNEL_LENGTH; i++)  
    { 
        n = (bytes.readFloat() * PLOT_HEIGHT); 
        g.lineTo(i * 2, PLOT_HEIGHT - n); 
    } 
    g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); 
    g.endFill(); 
     
    // right channel 
    g.lineStyle(0, 0xCC0066); 
    g.beginFill(0xCC0066, 0.5); 
    g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); 
     
    for (i = CHANNEL_LENGTH; i > 0; i--)  
    { 
        n = (bytes.readFloat() * PLOT_HEIGHT); 
        g.lineTo(i * 2, PLOT_HEIGHT - n); 
    } 
    g.lineTo(0, PLOT_HEIGHT); 
    g.endFill(); 
} 
 
function onPlaybackComplete(event:Event) 
{ 
    removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
}

In dit voorbeeld wordt eerst een geluidsbestand geladen en afgespeeld, waarna er wordt geluisterd naar de gebeurtenis Event.ENTER_FRAME , die ervoor zorgt dat de methode onEnterFrame() wordt geactiveerd terwijl het geluid wordt afgespeeld. De methode onEnterFrame() begint met het aanroepen van de methode SoundMixer.computeSpectrum() , die de geluidsgolfgegevens in het bytes object ByteArray opslaat.

De geluidsgolf wordt geplot via de API voor vectortekeningen. Een lus for doorloopt de eerste 256 gegevenswaarden, die met het linkerstereokanaal corresponderen, en tekent een lijn van elk punt naar het daarop volgende punt door gebruik te maken van de methode Graphics.lineTo() . Een tweede lus for doorloopt de volgende set van 256 waarden en zet deze in omgekeerde volgorde uit, van rechts naar links. De resulterende golfplots kunnen een interessant spiegelbeeldeffect opleveren, zoals in de volgende afbeelding wordt weergegeven.