Accesso ai dati audio originari

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

Il metodo SoundMixer.computeSpectrum() consente a un'applicazione di leggere i dati audio originari per la forma d'onda in corso di riproduzione. Se al momento è in corso di riproduzione più di un oggetto SoundChannel, il metodo SoundMixer.computeSpectrum() mostra i dati audio combinati di tutti gli oggetti SoundChannel.

I dati audio vengono restituiti sotto forma di un oggetto ByteArray che contiene 512 byte di dati, ciascuno dei quali contiene un valore a virgola mobile compreso tra -1 e 1. Questi valori rappresentano l'ampiezza dei punti all'interno della forma d'onda audio in corso di riproduzione. I valori vengono distribuiti in due gruppi di 256 byte, il primo per il canale stereo sinistro e il secondo per il canale stereo destro.

Il metodo SoundMixer.computeSpectrum() restituisce i dati dello spettro di frequenze anziché i dati della forma d'onda se il parametro FFTMode è impostato su true . Lo spettro di frequenze mostra l'ampiezza organizzata in base alla frequenza audio, dalla più bassa alla più alta. Per convertire i dati della forma d'onda in dati dello spettro di frequenze viene utilizzato un algoritmo Fast Fourier Transform (FFT). I valori dello spettro di frequenze risultanti sono compresi tra 0 e circa 1,414 (la radice quadrata di 2).

Il diagramma seguente confronta i dati restituiti dal metodo computeSpectrum() quando il parametro FFTMode è impostato su true e quando è impostato su false . L'audio di cui sono stati utilizzati i dati in questo diagramma contiene un suono basso molto forte nel canale sinistro e il suono di un colpo di tamburo nel canale destro.
Visualizzazione dell’elemento grafico a dimensioni intere
Valori restituiti dal metodo SoundMixer.computeSpectrum()
A.
fftMode=true

B.
fftMode=false

Il metodo computeSpectrum() può anche restituire dati che sono stati ricampionati a una frequenza di campionamento inferiore. Di solito, ciò produce dati della forma d'onda o della frequenza più attenuati ma anche meno dettagliati. Il parametro stretchFactor controlla la frequenza di campionamento con cui vengono campionati i dati del metodo computeSpectrum() . Quando il parametro stretchFactor è impostato su 0 (valore predefinito), i dati audio vengono campionati a una frequenza di campionamento di 44,1 kHz. La frequenza di campionamento viene dimezzata a ogni successivo valore del parametro stretchFactor, pertanto il valore 1 specifica una frequenza di 22,05 kHz, il valore 2 specifica una frequenza di 11,025 kHz e così via. Il metodo computeSpectrum() torna a restituire 256 byte per canale stereo quando si utilizza un valore stretchFactor maggiore.

Il metodo SoundMixer.computeSpectrum() presenta alcune limitazioni:

In AIR tuttavia il contenuto della sandbox di sicurezza dell'applicazione (contenuto installato con l'applicazione AIR) non è limitato da tali restrizioni di sicurezza.

Creazione di un semplice visualizzatore audio

L'esempio seguente utilizza il metodo SoundMixer.computeSpectrum() per mostrare un grafico della forma d'onda audio che si anima in corrispondenza di ogni fotogramma:

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

Innanzi tutto, questo esempio carica e riproduce un file audio, quindi intercetta l'evento Event.ENTER_FRAME , il quale attiva il metodo onEnterFrame() durante la riproduzione dell'audio. Il metodo onEnterFrame() comincia chiamando il metodo SoundMixer.computeSpectrum() , che memorizza i dati della forma d'onda audio nell'oggetto bytes di ByteArray.

L'immagine della forma d'onda viene formata mediante l'API di disegno vettoriale. Un ciclo for accede in sequenza ai primi 256 valori di dati, che rappresentano il canale stereo sinistro, e disegna una linea da un punto a quello successivo mediante il metodo Graphics.lineTo() . Un secondo ciclo for accede in sequenza alla serie di 256 valori successiva, ma formandone l'immagine in ordine inverso, da destra a sinistra. Le immagini delle forme d'onda risultanti possono produrre un effetto speculare molto suggestivo, come mostrato nell'immagine seguente.