Zugreifen auf Raw-Sounddaten

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Mit der SoundMixer.computeSpectrum() -Methode kann eine Anwendung die Raw-Sounddaten der aktuell wiedergegebenen Wellenform einlesen. Wenn aktuell mehrere SoundChannel-Objekte wiedergegeben werden, zeigt die SoundMixer.computeSpectrum() -Methode die kombinierten und gemischten Sounddaten aller SoundChannel-Objekte an.

Die Sounddaten werden als ein ByteArray-Objekt mit 512 Byte Dateninhalt zurückgegeben. Jedes Objekt enthält eine Gleitkommazahl zwischen -1 und 1. Diese Werte repräsentieren die Amplitude der Punkte in der wiedergegebenen Soundwellenform. Die Werte werden in zwei 256er-Gruppen bereitgestellt, die erste Gruppe für den linken Stereokanal und die zweite Gruppe für den rechten Stereokanal.

Wenn der FFTMode -Parameter auf true gesetzt ist, gibt die SoundMixer.computeSpectrum() -Methode anstelle von Wellenformdaten Frequenzspektrumdaten zurück. Das Frequenzspektrum zeigt eine nach der Soundfrequenz angeordnete Amplitude an, von der niedrigsten Frequenz zu höchsten. Zum Konvertieren der Wellenformdaten in Frequenzspektrumdaten wird ein Fast Fourier Transform (FFT) eingesetzt. Die resultierenden Frequenzspektrumwerte befinden sich im Bereich von 0 bis etwa 1,414 (Quadratwurzel aus 2).

Im folgenden Diagramm werden die von der computeSpectrum() -Methode zurückgegebenen Daten bei einer FFTMode -Parametereinstellung von true und einer Einstellung von false verglichen. Der Sound, dessen Daten in diesem Diagramm verwendet wurden, enthält einen lauten Basston auf dem linken Kanal und einen Schlagzeugton auf dem rechten Kanal.
Grafik in Originalgröße anzeigen
Von der SoundMixer.computeSpectrum()-Methode zurückgegebene Werte
A.
fftMode=true

B.
fftMode=false

Die computeSpectrum() -Methode kann auch Daten zurückgeben, die mit einer niedrigeren Bitrate neu gesampelt wurden. Im Allgemeinen führt dies zu sanfteren Wellenformdaten oder Frequenzdaten bei geringeren Details. Der stretchFactor -Parameter bestimmt die Rate, mit der die computeSpectrum() -Methode Daten abtastet. Wenn der stretchFactor -Parameter auf 0 (die Standardeinstellung) eingestellt ist, werden die Sounddaten mit einer Rate von 44,1 kHz abgetastet. Die Abtastrate wird bei jedem nachfolgenden Wert für den stretchFactor-Parameter halbiert. Somit gibt der Wert 1 eine Abtastrate von 22,05 kHz an, der Wert 2 eine Abtastrate von 11,025 kHz usw. Die computeSpectrum() -Methode gibt weiterhin 256 Byte pro Stereokanal zurück, auch wenn ein höherer stretchFactor -Wert verwendet wird.

Die SoundMixer.computeSpectrum() -Methode weist einige Einschränkungen auf:

  • Da Sounddaten von einem Mikrofon oder von RTMP-Streams das globale SoundMixer-Objekt nicht passieren, kann die SoundMixer.computeSpectrum() -Methode von diesen Quellen keine Daten zurückgeben.

  • Stammt einer oder mehrere der wiedergegebenen Sounds von Quellen außerhalb der aktuellen Inhalts-Sandbox, wird aufgrund der Sicherheitseinstellungen ein Fehler durch die SoundMixer.computeSpectrum() -Methode auslöst. Nähere Einzelheiten über die Sicherheitseinschränkungen der SoundMixer.computeSpectrum() -Methode finden Sie unter Sicherheitsüberlegungen beim Laden und Wiedergeben von Sounds und Zugriff auf geladene Medien als Daten .

Jedoch unterliegt in einer AIR-Anwendung Inhalt, der in der Sicherheits-Sandbox der Anwendung ausgeführt wird (Inhalt, der mit der AIR-Anwendung installiert wird), nicht diesen Sicherheitseinschränkungen.

Erstellen eines einfachen Anzeigeprogramms für Sounds

Im folgenden Beispiel wird die SoundMixer.computeSpectrum() -Methode verwendet, um ein Diagramm der Sound-Wellenform anzuzeigen, die mit jedem Bild animiert wird:

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 diesem Beispiel wird zunächst eine Sounddatei geladen und wiedergegeben und dann das Event.ENTER_FRAME -Ereignis überwacht, das während der Soundwiedergabe die onEnterFrame() -Methode auslöst. Die onEnterFrame() -Methode beginnt mit dem Aufruf der SoundMixer.computeSpectrum() -Methode, die die Soundwellendaten im ByteArray-Objekt bytes speichert.

Die Soundwellenform wird mithilfe der Vektorzeichnungs-API geplottet. Eine for -Schleife durchläuft die ersten 256 Datenwerten, die den linken Kanal darstellen, und zeichnet mithilfe der Graphics.lineTo() -Methode eine Linie von einem Punkt zum nächsten. Eine zweite for -Schleife durchläuft die nächsten 256 Werte und zeichnet sie diesmal in umgekehrter Reihenfolge, von rechts nach links. Die resultierenden Wellenformplots können einen interessanten Spiegeleffekt erzeugen. Dies wird im folgenden Bild gezeigt.