Acesso a dados de som brutos

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

O método SoundMixer.computeSpectrum() permite que um aplicativo leia os dados de som brutos para a forma de onda que está sendo reproduzida no momento. Se mais de um objeto SoundChannel estiver sendo reproduzido, o método SoundMixer.computeSpectrum() mostrará os dados de som combinados de cada objeto SoundChannel misturado.

Os dados de som são retornados como um objeto ByteArray que contém 512 bytes de dados, cada um deles contendo um valor de ponto flutuante entre -1 e 1. Esses valores representam a amplitude dos pontos na forma de onda do som que está sendo reproduzido. Os valores são entregues em dois grupos de 256, o primeiro grupo do canal estéreo esquerdo e o segundo grupo do canal estéreo direito.

O método SoundMixer.computeSpectrum() retornará os dados do espectro da frequência em vez dos dados da forma de onda se o parâmetro FFTMode estiver definido como true . O espectro da frequência mostra a amplitude organizada pela frequência do som, da frequência mais baixa para a mais alta. Uma FFT (Transformação rápida de Fourier) é usada para converter os dados da forma de onda nos dados do espectro da frequência. Os valores do espectro da frequência resultantes variam de 0 a aproximadamente 1,414 (a raiz quadrada de 2).

O diagrama a seguir compara os dados retornados do método computeSpectrum() quando o parâmetro FFTMode está definido como true e quando está definido como false . O som cujos dados foram usados para esse diagrama contém um som grave alto no canal esquerdo e um som de toque de tambor no canal direito.
Exibir gráfico inteiro
Valores retornados pelo método SoundMixer.computeSpectrum()
A.
fftMode=true

B.
fftMode=false

O método computeSpectrum() também pode retornar dados que foram amostrados novamente em uma taxa de bits mais baixa. Geralmente, isso resulta em dados de forma de onda mais suaves ou em dados de frequência em detrimento de detalhes. O parâmetro stretchFactor controla a taxa na qual os dados do método computeSpectrum() são amostrados. Quando o parâmetro stretchFactor está definido como 0, o padrão, os dados do som são amostrados a uma taxa de 44,1 kHz. A taxa é dividida em dois em cada valor sucessivo do parâmetro stretchFactor, portanto um valor de 1 especifica uma taxa de 22,05 kHz, um valor de 2 especifica uma taxa de 11,025 kHz e assim por diante. O método computeSpectrum() ainda retorna 256 bytes por canal estéreo quando um valor de stretchFactor mais alto é usado.

O método SoundMixer.computeSpectrum() tem algumas limitações:

  • Como os dados do som de um microfone ou de fluxos RTMP não passam pelo objeto global SoundMixer, o método SoundMixer.computeSpectrum() não retorna dados dessas origens.

  • Se um ou mais dos sons que estão sendo reproduzidos de origens externas à caixa de proteção do conteúdo atual, restrições de segurança farão com que o método SoundMixer.computeSpectrum() emita um erro. Para obter mais detalhes sobre limitações de segurança do método SoundMixer.computeSpectrum() consulte Considerações sobre segurança ao carregar e reproduzir sons e Acesso à mídia carregada como dados .

Contudo, em um aplicativo do AIR, o conteúdo na caixa de proteção de segurança do aplicativo (conteúdo instalado com o aplicativo do AIR) não é restringido por essas limitações de segurança.

Criação de um único visualizador de som

O exemplo a seguir usa o método SoundMixer.computeSpectrum() para mostrar um gráfico da forma de onda do som que é animado com cada quadro:

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

Esse exemplo primeiro carrega e reproduz um arquivo de som e, em seguida, ouve o evento Event.ENTER_FRAME que disparará o método onEnterFrame() enquanto o som é reproduzido. O método onEnterFrame() é iniciado chamando o método SoundMixer.computeSpectrum() que armazena dos dados da onda do som no objeto ByteArray de bytes .

A forma de onda do som é plotada usando a API de desenho do vetor. Um loop for percorre os primeiros 256 valores de dados que representam o canal estéreo esquerdo e desenha uma linha de cada ponto até o próximo usando o método Graphics.lineTo() . Um segundo loop for percorre o próximo conjunto de 256 valores, plotando-os na ordem reversa desta vez, da direita para a esquerda. Os desenhos da forma de onda resultantes podem produzir um efeito interessante de imagem espelhada, conforme mostrado na imagem a seguir.