SoundMixer.computeSpectrum()
yöntemi, bir uygulamanın geçerli olarak oynatılan dalga formu için ham ses verilerini okumasına olanak sağlar. Geçerli olarak birden çok SoundChannel nesnesi oynatılıyorsa,
SoundMixer.computeSpectrum()
yöntemi, birbirine karıştırılan her SoundChannel nesnesinin birleştirilmiş ses verisini gösterir.
Ses verileri, her biri -1 ile 1 arasında kayan nokta değeri içeren, 512 bayt verinin bulunduğu bir ByteArray nesnesi olarak döndürülür. Bu değerler, oynatılan ses dalga formunda noktaların genliğini temsil eder. Değerler 256'lık iki grup halinde teslim edilir, birinci grup sol stereo kanalı için ve ikinci grup da sağ stereo kanalı içindir.
FFTMode
parametresi
true
değerine ayarlandığında,
SoundMixer.computeSpectrum()
yöntemi, dalga formu verisini değil, frekans spektrumu verisini döndürür. Frekans spektrumu, en düşük frekanstan en yüksek frekansa doğru, ses frekansı tarafından düzenlenen genliği gösterir. Dalga formunu frekans spektrumu verilerine dönüştürmek için Fast Fourier Transform (FFT) kullanılır. Sonuçta elde edilen frekans spektrumu değerleri, 0 ile kabaca 1,414 (2'nin kare kökü) arasındadır.
Aşağıdaki diyagram,
FFTMode
parametresi
true
olarak ve
false
olarak ayarlandığında
computeSpectrum()
yönteminden döndürülen verileri karşılaştırır. Bu diyagram için verileri kullanılan ses, sol kanalda yüksek bir bas sesi ve sağ kanalında bir davul vuruşu sesi içerir.
computeSpectrum()
yöntemi ayrıca daha düşük bir bit hızında yeniden örneklenmiş verileri de döndürebilir. Genellikle bu, ayrıntı kaybına yol açacak şekilde daha yumuşak bir dalga formu verisiyle veya frekans verisiyle sonuçlanır.
stretchFactor
parametresi,
computeSpectrum()
yöntemi verilerinin örneklendiği hızı denetler.
stretchFactor
parametresi varsayılan 0 değerine ayarlandığında, ses verileri 44,1 kHz hızında örneklenir. stretchFactor parametresinin art arda her değerinde hız yarıya iner, bu nedenle, 1 değeri 22,05 kHz hızı belirtir, 2 değeri 11,025 kHz hızı belirtir ve bu şekilde devam eder. Daha yüksek bir
stretchFactor
değeri kullanıldığında,
computeSpectrum()
yöntemi tek bir stereo kanalı için 256 bayt döndürmeye devam eder.
SoundMixer.computeSpectrum()
yöntemi bazı sınırlamalara sahiptir:
-
Bir mikrofondan veya RTMP akışından gelen ses verileri genel bir SoundMixer nesnesinden geçmediğinden,
SoundMixer.computeSpectrum()
yöntemi bu kaynaklardan veri döndürmez.
-
Çalınan seslerden biri veya birkaçı, geçerli içerik sanal alanı dışındaki kaynaklardan geliyorsa, güvenlik kısıtlamaları,
SoundMixer.computeSpectrum()
yönteminin bir hata atmasına neden olur.
SoundMixer.computeSpectrum()
yönteminin güvenlik sınırlamaları hakkında daha fazla ayrıntılı bilgi almak için, bkz.
Sesler yüklenirken ve çalınırken dikkate alınması gereken güvenlikle ilgili noktalar
ve
Veri olarak yüklenen ortama erişme
.
Ancak AIR uygulamasında, uygulama güvenlik sanal alanındaki içerik (AIR uygulamasıyla yüklenmiş içerik), bu güvenlik sınırlamalarıyla kısıtlandırılmaz.
Basit ses görselleştiricisi oluşturma
Aşağıdaki örnek, her kareyle animasyon uygulanan bir ses dalga formu grafiğini göstermek için
SoundMixer.computeSpectrum()
yöntemini kullanır:
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);
}
Bu örnek ilk önce bir ses dosyasını yükler ve çalar daha sonra, ses çalınırken
onEnterFrame()
yöntemini tetikleyen
Event.ENTER_FRAME
olayını dinler.
onEnterFrame()
yöntemi,
bytes
ByteArray nesnesinde ses dalgası verilerini saklayan
SoundMixer.computeSpectrum()
yönteminin çağrılmasıyla başlatılır.
Ses dalga formu, vektör çizim API'si kullanılarak çizilir.
for
döngüsü, sol stereo kanalını temsil eden ilk 256 veri değeri üzerinde döngü gerçekleştirir ve
Graphics.lineTo()
yöntemini kullanarak her noktadan bir sonraki noktaya bir çizgi çizer. İkinci bir
for
döngüsü de bir sonraki 256 değer kümesinde döngü gerçekleştirerek bu defa tam tersi yönde, sağdan sola çizim yapar. Sonuçta elde edilen dalga formu çizimleri, aşağıdaki görüntüde görüldüğü gibi, ilginç bir aynı görüntüsü efekti oluşturabilir.
|
|
|