Använda råa ljuddata

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Med metoden SoundMixer.computeSpectrum() kan ett program läsa råa ljuddata för den vågform som spelas upp. Om mer än ett SoundChannel-objekt spelas upp visar SoundMixer.computeSpectrum()-metoden kombinerat ljuddata för alla SoundChannel-objekt tillsammans.

Ljuddata returneras som ett ByteArray-objekt på 512 byte, där vart och ett innehåller ett flyttalsvärde mellan -1 och 1. De här värdena representerar amplituden för positionerna i ljudvågformen som spelas upp. Värdena levereras i två grupper om 256, den första gruppen för den vänstra stereokanalen och den andra gruppen för den högra stereokanalen.

SoundMixer.computeSpectrum()-metoden returnerar frekvensspektrumdata i stället för vågformsdata om parametern FFTMode har värdet true. I frekvensspektrumet visas amplituden arrangerad per ljudfrekvens från den lägsta frekvensen till den högsta. Fast Fourier Transform (FFT) används för att konvertera vågformsdata till frekvensspektrumdata. Det resulterande frekvensspektrumvärdet ligger i ett intervall från 0 till ungefär 1,414 (kvadratroten ur 2).

I följande diagram jämförs data som returnerats från computeSpectrum()-metoden när FFTMode-parametern angetts till true och när den har angetts till false. Ljuddata till det här diagrammet innehåller ett högt basljud i den vänstra kanalen och ett trumsolo i den högra kanalen.
Visa grafik i full storlek
Värden som returnerats av metoden SoundMixer.computeSpectrum()
A.
fftMode = true

B.
fftMode = false

computeSpectrum() kan också returnera data som har samplats om på en lägre bithastighet. Vanligtvis resulterar det här i jämnare vågformsdata eller frekvensdata men det försämrar detaljerna. Parametern stretchFactor styr hastigheten med vilken computeSpectrum()-metoddata samplas. När parametern stretchFactor har värdet 0 (standardvärdet) samplas ljuddata med en hastighet på 44.1 kHz. Hastigheten halveras för varje värde i stretchFactor-parametern så värdet 1 specificerar en hastighet av 22.05 kHz, värdet 2 specificerar en hastighet av 11.025 kHz o.s.v. Metoden computeSpectrum() returnerar fortfarande 256 byte per stereokanal när ett högre stretchFactor-värde används.

SoundMixer.computeSpectrum()-metoden har några begränsningar:

  • Eftersom ljuddata från en mikrofon eller från RTMP-direktuppspelning inte överförs via det globala SoundMixer-objektet kommer SoundMixer.computeSpectrum()-metoden inte att returnera data från dessa källor.

  • Om fler än ett av ljuden som spelas upp kommer från källor utanför den aktuella innehållssandlådan, kommer säkerhetsbegränsningarna att få SoundMixer.computeSpectrum()-metoden att orsaka ett fel. Mer information om säkerhetsbegränsningarna i metoden SoundMixer.computeSpectrum() finns i Säkerhetsaspekter vid inläsning och uppspelning av ljud och Åtkomst av inlästa medier som data.

I ett AIR-program begränsas emellertid inte innehåll i säkerhetssandlådan application (innehåll som installeras med AIR-programmet) av de här säkerhetsbegränsningarna.

Skapa en enkel ljudvisualisering

I följande exempel används SoundMixer.computeSpectrum()-metoden för att visa ett diagram över ljudvågformen som animeras med varje bildruta:

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); 
}

Först läses en ljudfil in och spelas upp och sedan avlyssnas Event.ENTER_FRAME-händelsen som aktiverar onEnterFrame()-metoden medan ljudet spelas upp. Metoden onEnterFrame() börjar med att anropa SoundMixer.computeSpectrum()-metoden vilken lagrar ljudvågsdata i ByteArray-objektet bytes.

Ljudvågsformen ritas med vektorritnings-API. En for-slinga går igenom de första 256 datavärdena som representerar den vänstra stereokanalen och ritar en linje från punkt till punkt med Graphics.lineTo()-metoden. En andra for-slinga går igenom de följande 256 värdena och ritar dem i motsatt ordning den här gången, från höger till vänster. De slutliga vågformsritningarna kan ge en intressant spegelbildseffekt enligt exempel i följande bild.