Ham ses verilerine erişme

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

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.
Grafiği tam boyut görüntüle
SoundMixer.computeSpectrum() yöntemi tarafından döndürülen değerler
A.
fftMode=true

B.
fftMode=false

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.