Sesleri çalma

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

Yüklenmiş bir sesin çalınması, aşağıdaki gibi, Sound nesnesi için Sound.play() yönteminin çağrılması kadar basit olabilir:

var snd:Sound = new Sound(new URLRequest("smallSound.mp3")); 
snd.play();

ActionScript 3.0'ı kullanarak sesleri çaldığınızda şu işlemleri gerçekleştirebilirsiniz:

  • Belirli bir başlangıç konumundan ses çalma

  • Sesi duraklatıp daha sonra aynı konumdan çalmaya devam etme

  • Ses çalınmasının ne zaman biteceğini tam olarak bilme

  • Ses çalınmasının ilerlemesini izleme

  • Ses çalınırken ses düzeyini değiştirme veya yatay kaydırma

Çalma sırasında bu işlemleri gerçekleştirmek için SoundChannel, SoundMixer ve SoundTransform sınıflarını kullanın.

SoundChannel sınıfı, tek bir sesin çalınmasını denetler. SoundChannel.position özelliği, çalınan ses verisinde geçerli noktayı belirten bir oynatma kafası olarak düşünülebilir.

Bir uygulama Sound.play() yöntemini çağırdığında, çalmayı denetlemek için SoundChannel sınıfının yeni bir örneği oluşturulur.

Uygulamanız, belirli bir başlangıç konumunu milisaniye cinsinden Sound.play() yönteminin startTime parametresi olarak iletip sesi o başlangıç konumundan itibaren çalabilir. Sound.play() yönteminin loops parametresinde bir sayısal değer ileterek hızlı şekilde art arda sesi yinelemek için sabit bir tekrarlama sayısı da belirtebilir.

Sound.play() yöntemi hem startTime parametresiyle hem de loops parametresiyle çağrıldığında, aşağıdaki kodda gösterildiği gibi, her defasında aynı başlangıç noktasından art arda ses çalınır:

var snd:Sound = new Sound(new URLRequest("repeatingSound.mp3")); 
snd.play(1000, 3);

Bu örnekte, ses, ses başlangıcından bir saniye sonraki noktadan itibaren üç defa art arda çalınır.

Sesi duraklatma ve yeniden başlatma

Uygulamanız, şarkı veya podcast'ler gibi uzun sesler çalıyorsa, kullanıcıların bu seslerin çalınmasını duraklatıp yeniden başlatmasına olanak sağlamak isteyebilirsiniz. ActionScript'te ses çalınırken duraklatılamaz; yalnızca durdurulabilir. Ancak ses, herhangi bir noktadan başlayarak çalınabilir. Sesin durdurulduğu zamanki konumunu kaydedip daha sonra o konumdan başlayarak sesi yeniden çalabilirsiniz.

Örneğin, kodunuzun şöyle bir ses dosyasını yükleyip oynattığını varsayalım:

var snd:Sound = new Sound(new URLRequest("bigSound.mp3")); 
var channel:SoundChannel = snd.play();

Ses çalınırken SoundChannel.position özelliği, ses dosyasındaki geçerli olarak çalınan noktayı belirtir. Uygulamanız aşağıdaki gibi, ses çalmasını durdurmadan önce konum değerini saklayabilir:

var pausePosition:int = channel.position; 
channel.stop();

Ses çalmasını yeniden başlatmak için, önceden saklanan konum değerini ileterek, sesi önceden durdurulduğu noktadan yeniden başlatın.

channel = snd.play(pausePosition);

Çalmayı izleme

Uygulamanız, başka bir ses çalmaya başlayabilmek veya önceki çalma işlemi sırasında kullanılan bazı kaynakları temizlemek için sesin ne zaman çalmayı durduracağını bilmek isteyebilir. SoundChannel sınıfı, ses çalması bitince bir Event.SOUND_COMPLETE olayı gönderir. Uygulamanız, aşağıda gösterildiği gibi bu olayı dinleyip uygun eylemi gerçekleştirebilir:

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var snd:Sound = new Sound(); 
var req:URLRequest = new URLRequest("smallSound.mp3"); 
snd.load(req); 
 
var channel:SoundChannel = snd.play(); 
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
 
public function onPlaybackComplete(event:Event) 
{ 
    trace("The sound has finished playing."); 
}

SoundChannel sınıfı, çalma sırasında ilerleme olayları göndermez. Çalma ilerlemesiyle ilgili bildirim göndermek için, uygulamanız kendi zamanlama mekanizmasını oluşturup ses oynatma kafasının konumunu izleyebilir.

Sesin yüzde kaçının çalındığını hesaplamak için, SoundChannel.position özelliğinin değerini, çalınan ses verisinin uzunluğuna bölebilirsiniz:

var playbackPercent:uint = 100 * (channel.position / snd.length);

Ancak bu kod, yalnızca çalma işlemi başlamadan önce ses verisi tamamen yüklenmişse, tam olarak doğru çalma yüzdelerini bildirir. Sound.length özelliği, ses dosyasının tamamının son boyutunu değil, geçerli olarak yüklenen ses verisinin boyutunu gösterir. Halen yüklenmekte olan akışa alınan sesin çalma ilerlemesini izlemek için uygulamanızın tam ses dosyasının son boyutunu tahmin edip hesaplamalarında bu değeri kullanması gerekir. Aşağıdaki gibi, Sound nesnesinin bytesLoaded ve bytesTotal özelliklerini kullanarak ses verisinin son uzunluğunu tahmin edebilirsiniz:

var estimatedLength:int =  
    Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); 
var playbackPercent:uint = 100 * (channel.position / estimatedLength);

Aşağıdaki kod, daha büyük bir ses dosyasını yükler ve çalma ilerlemesini göstermek için zamanlama mekanizması olarak Event.ENTER_FRAME olayını kullanır. Geçerli konum değerinin toplam ses verisi uzunluğuna bölünmesiyle elde edilen çalma yüzdesiyle ilgili olarak düzenli aralıklarla bildirim gönderir:

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var snd:Sound = new Sound(); 
var req:URLRequest = new  
    URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3"); 
snd.load(req); 
 
var channel:SoundChannel; 
channel = snd.play(); 
addEventListener(Event.ENTER_FRAME, onEnterFrame); 
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
 
function onEnterFrame(event:Event):void 
{ 
    var estimatedLength:int =  
        Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); 
    var playbackPercent:uint =  
        Math.round(100 * (channel.position / estimatedLength)); 
    trace("Sound playback is " + playbackPercent + "% complete."); 
} 
 
function onPlaybackComplete(event:Event) 
{ 
    trace("The sound has finished playing."); 
    removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
}

Ses verisi yüklenmeye başladıktan sonra, bu kod snd.play() yöntemini çağırır ve sonuçta elde edilen SoundChannel nesnesini channel değişkeninde saklar. Bu daha sonra Event.ENTER_FRAME olayı için ana uygulamaya bir olay dinleyicisi eklerken, çalma tamamlandığında gerçekleşen Event.SOUND_COMPLETE olayı için de SoundChannel nesnesine başka bir olay dinleyicisi ekler.

Uygulama, animasyonunda yeni bir kareye her ulaştığında, onEnterFrame() yöntemi çağrılır. onEnterFrame() yöntemi, yüklenmiş olan veri miktarını esas alarak ses dosyasının toplam uzunluğunu tahmin eder, daha sonra da geçerli oynatma yüzdesini hesaplayıp görüntüler.

Sesin tamamı çalındığında, onPlaybackComplete() yöntemi çalıştırılarak çalma bittikten sonra ilerleme güncellemelerini görüntülememesi için Event.ENTER_FRAME olayının olay dinleyicisi kaldırılır.

Event.ENTER_FRAME olayı, saniyede birkaç defa gönderilebilir. Bazı durumlarda, çalma ilerlemesini bu kadar sıkça görüntülemek istemezsiniz. Bu durumlarda, uygulamanız flash.util.Timer sınıfını kullanarak kendi zamanlama mekanizmasını ayarlayabilir; bkz. Tarih ve saatlerle çalışma .

Akışa alınan sesleri durdurma

Akışa alınan—başka bir deyişle, çalınırken halen yüklenmekte olan seslerin çalınması işleminde garip bir durum vardır. Uygulamanız akışa alınan bir sesi çalan SoundChannel örneğinde SoundChannel.stop() yöntemini çağırır, ses çalması bir kare boyunca durdurulur, sonraki karede sesin başından itibaren yeniden çalma işlemi başlatılır. Ses yükleme işlemi devam ettiği için bu durum oluşur. Akışa alınan sesin hem yüklemesini hem de çalınmasını durdurmak için, Sound.close() yöntemini çağırın.