Zugreifen auf Raw-SounddatenFlash 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
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:
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 SoundsIm 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. ![]() |
|