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.
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.