Ses örneği: Podcast Oynatıcısı

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

Podcast, istek üzerine veya abonelik yoluyla Internet üzerinden dağıtılan bir ses dosyasıdır. Podcast'ler genellikle podcast kanalı olarak da bilinen serilerin bir parçası olarak yayınlanır. Podcast bölümleri bir dakika ile birkaç saat arasında değişebildiğinden genellikle oynatılırken akışa alınır. Öğe olarak da adlandırılan podcast bölümleri genellikle mp3 biçiminde sunulur. Video podcast'leri de çok sık kullanılır ancak bu örnek uygulama yalnızca mp3 dosyaları kullanan ses podcast'lerini oynatır.

Bu örnek tam özellikli bir podcast toplayıcı uygulama değildir. Örneğin, bu belirli podcast'lere abonelikleri yönetmez veya uygulama bir sonraki defa çalıştırıldığında kullanıcının hangi podcast'leri dinlediğini hatırlamaz. Bu daha tam özellikli bir podcast toplayıcısı için başlangıç noktası görevi görür.

Podcast Player örneği, şu ActionScript programlama tekniklerini gösterir:

  • Harici bir RSS beslemesini okuma ve XML içeriğini ayrıştırma

  • Ses dosyalarının yüklenmesini ve oynatılmasını basitleştirmek için SoundFacade sınıfı oluşturma

  • Ses çalma ilerlemesini görüntüleme

  • Ses çalmasını duraklatma ve yeniden başlatma

Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr . Podcast Player uygulama dosyalarını Samples/PodcastPlayer klasöründe bulabilirsiniz. Uygulama aşağıdaki dosyaları içerir:

File

Açıklama

PodcastPlayer.mxml

veya

PodcastPlayer.fla

Flex (MXML) veya Flash (FLA) uygulaması için kullanıcı arabirimi.

comp/example/programmingas3/podcastplayer/PodcastPlayer.as

Podcast player için kullanıcı arabirimi mantığını içeren belge sınıfı (yalnızca Flash).

SoundPlayer.mxml

Yalnızca Flex için oynatma düğmelerini ve ilerleme çubuklarını görüntüleyen ve ses çalmasını denetleyen bir MXML bileşeni.

main.css

Uygulama kullanıcı arabirimi için stiller (yalnızca Flex).

images/

Düğme stilleri için simgeler (yalnızca Flex).

comp/example/programmingas3/podcastplayer/SoundPlayer.as

Ses oynatıcısı için kullanıcı arabirimi mantığını içeren SoundPlayer film klibi simgesi için sınıf (yalnızca Flash).

comp/example/programmingas3/podcastplayer/PlayButtonRenderer.as

Veri ızgara hücresinde bir oynatma düğmesini görüntülemek için özel hücre oluşturucu (Yalnızca Flash).

com/example/programmingas3/podcastplayer/RSSBase.as

RSSChannel sınıfı ve RSSItem sınıfı için ortak özellikler ve yöntemler sağlayan bir temel sınıf.

com/example/programmingas3/podcastplayer/RSSChannel.as

RSS kanalı hakkında verileri barındıran bir ActionScript sınıfı.

com/example/programmingas3/podcastplayer/RSSItem.as

RSS öğesi hakkında verileri barındıran bir ActionScript sınıfı.

com/example/programmingas3/podcastplayer/SoundFacade.as

Uygulamanın ana ActionScript sınıfı Sound sınıfının ve SoundChannel sınıfının yöntemlerini ve olaylarını kapsüller ve oynatmanın duraklatılması ve yeniden başlatılmasına yönelik destek ekler.

com/example/programmingas3/podcastplayer/URLService.as

Uzak bir URL'den gelen verileri alan bir ActionScript sınıfı.

playerconfig.xml

Podcast kanallarını temsil eden RSS beslemelerinin listesini içeren bir XML dosyası.

comp/example/programmingas3/utils/DateUtil.as

Kolay tarih biçimlendirme için kullanılan sınıf (yalnızca Flash).

Podcast kanalı için RSS verilerini okuma

Podcast Player uygulaması, çok sayıda podcast kanalı ve bölümleri hakkında bilgiler okunarak başlatılır:

1. İlk olarak uygulama, podcast kanallarının listesini içeren bir XML konfigürasyon dosyasını okur ve kanalların listesini kullanıcıya görüntüler.

2. Kullanıcı podcast kanallarından birini seçtiğinde, kanalın RSS beslemesini okur ve kanal bölümlerinin listesini görüntüler.

Bu örnek, uzak bir konumdan veya yerel dosyadan metin tabanlı verileri almak için URLLoader yardımcı program sınıfını kullanır. Podcast Player ilk olarak playerconfig.xml dosyasından RSS beslemelerinin listesini XML biçiminde almak için bir URLLoader nesnesi oluşturur. Daha sonra kullanıcı listeden belirli bir beslemeyi seçtiğinde, o beslemenin URL'sinden RSS verilerini okumak için yeni bir URLLoader nesnesi oluşturulur.

SoundFacade sınıfını kullanarak ses yüklemesini ve çalınmasını basitleştirme

ActionScript 3.0 ses mimarisi güçlü ancak karmaşıktır. Yalnızca temel ses yükleme ve çalma özelliklerine ihtiyaç duyan uygulamalar, daha basit bir yöntem çağrıları ve olayları kümesi sağlayarak karmaşıklığın bir kısmını gizleyen bir sınıfı kullanabilir. Yazılım tasarımı modelleri dünyasında bu sınıf cephe olarak adlandırılır.

SoundFacade sınıfı, şu görevlerin gerçekleştirilmesine yönelik tek bir arabirim sunar:

  • Sound nesnesini, SoundLoaderContext nesnesini ve SoundMixer sınıfını kullanarak ses dosyaları yükleme

  • Sound nesnesini ve SoundChannel nesnesini kullanarak ses dosyalarını çalma

  • Çalma ilerlemesi olaylarını gönderme

  • Sound nesnesini ve SoundChannel nesnesini kullanarak ses çalınmasını duraklatma ve yeniden başlatma

SoundFacade sınıfı, ActionScript ses sınıflarının en çok sayıda işlevini en az karmaşıklıkta sunmaya çalışır.

Aşağıdaki sınıf, sınıf bildirimini, sınıf özelliklerini ve SoundFacade() yapıcı yöntemini gösterir:

public class SoundFacade extends EventDispatcher 
{ 
    public var s:Sound; 
    public var sc:SoundChannel; 
    public var url:String; 
    public var bufferTime:int = 1000; 
 
    public var isLoaded:Boolean = false; 
    public var isReadyToPlay:Boolean = false; 
    public var isPlaying:Boolean = false; 
    public var isStreaming:Boolean = true; 
    public var autoLoad:Boolean = true; 
    public var autoPlay:Boolean = true; 
         
    public var pausePosition:int = 0; 
         
    public static const PLAY_PROGRESS:String = "playProgress"; 
    public var progressInterval:int = 1000; 
    public var playTimer:Timer; 
         
    public function SoundFacade(soundUrl:String, autoLoad:Boolean = true, 
                                    autoPlay:Boolean = true, streaming:Boolean = true,  
                                    bufferTime:int = -1):void 
    { 
        this.url = soundUrl; 
 
        // Sets Boolean values that determine the behavior of this object 
        this.autoLoad = autoLoad; 
        this.autoPlay = autoPlay; 
        this.isStreaming = streaming; 
 
        // Defaults to the global bufferTime value 
        if (bufferTime < 0) 
        { 
            bufferTime = SoundMixer.bufferTime; 
        } 
 
        // Keeps buffer time reasonable, between 0 and 30 seconds 
        this.bufferTime = Math.min(Math.max(0, bufferTime), 30000); 
         
        if (autoLoad) 
        { 
            load(); 
        } 
    }

SoundFacade sınıfı, kendi olaylarını gönderebilecek şekilde EventDispatcher sınıfını genişletir. Sınıf kodu ilk olarak bir Sound nesnesi ve bir SoundChannel nesnesi için özellikleri bildirir. Bu sınıf ayrıca ses dosyasının URL'sinin değerini ve ses akışa alınırken kullanılacak bufferTime özelliğini içerir. Üstelik yükleme ve çalma davranışını etkileyen bazı Boolean parametrelerini de kabul eder:

  • autoLoad parametresi, ses yüklemesinin bu nesne oluşturulduğu anda başlaması gerektiğini nesneye bildirir.

  • autoPlay parametresi, ses çalınmasının yeterli ses verisi yüklendiği anda başlaması gerektiğini belirtir. Bu akışa alınan bir ses ise, bufferTime özelliği tarafından belirtildiği şekilde yeterince veri yüklendiği anda çalma işlemi başlar.

  • streaming parametresi, bu ses dosyasının yükleme tamamlanmadan önce çalınmaya başlayabildiğini belirtir.

bufferTime parametresinin varsayılan değeri -1'dir. Yapıcı yöntemi bufferTime parametresinde negatif bir değer algılarsa, bufferTime özelliğini SoundMixer.bufferTime değerine ayarlar. Bu, istendiği zaman uygulamanın genel SoundMixer.bufferTime değerini varsayılan olarak uygulamasına olanak sağlar.

autoLoad parametresi true değerine ayarlanırsa, ses dosyasının yüklemesini başlatmak için yapıcı yöntemi hemen şu load() yöntemini çağırır:

public function load():void 
{ 
    if (this.isPlaying) 
    { 
        this.stop(); 
        this.s.close(); 
    } 
    this.isLoaded = false; 
     
    this.s = new Sound(); 
     
    this.s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); 
    this.s.addEventListener(Event.OPEN, onLoadOpen); 
    this.s.addEventListener(Event.COMPLETE, onLoadComplete); 
    this.s.addEventListener(Event.ID3, onID3); 
    this.s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
    this.s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onIOError); 
     
    var req:URLRequest = new URLRequest(this.url); 
     
    var context:SoundLoaderContext = new SoundLoaderContext(this.bufferTime, true); 
    this.s.load(req, context); 
}

load() yöntemi yeni bir Sound nesnesi oluşturur ve sonra tüm önemli ses olayları için dinleyiciler ekler. Daha sonra Sound nesnesine, bufferTime değerinde iletmek üzere SoundLoaderContext nesnesini kullanarak ses dosyasını yüklemesini bildirir.

url özelliği değiştirilebildiğinden, art arda farklı ses dosyalarını çalmak için SoundFacade örneği kullanılabilir: yalnızca url özelliğinin değiştirilip load() yönteminin çağrılması sonucunda yeni ses dosyası yüklenmiş olur.

Aşağıdaki olay dinleyicisi yöntemleri, SoundFacade nesnesinin yükleme ilerlemesini nasıl izlediğini ve ses çalmasını başlatmaya nasıl karar verdiğini gösterir:

public function onLoadOpen(event:Event):void 
{ 
    if (this.isStreaming) 
    { 
        this.isReadyToPlay = true; 
        if (autoPlay) 
        { 
            this.play(); 
        } 
    } 
    this.dispatchEvent(event.clone()); 
} 
 
public function onLoadProgress(event:ProgressEvent):void 
{  
    this.dispatchEvent(event.clone()); 
} 
 
public function onLoadComplete(event:Event):void 
{ 
    this.isReadyToPlay = true; 
    this.isLoaded = true; 
    this.dispatchEvent(evt.clone()); 
     
    if (autoPlay && !isPlaying) 
    { 
        play(); 
    } 
}

Ses yüklemesi başladığında onLoadOpen() yöntemi çalıştırılır. Akışa alma modunda ses çalınabiliyorsa, onLoadComplete() yöntemi hemen isReadyToPlay bayrağını true değerine ayarlar. isReadyToPlay bayrağı, uygulamanın, belki de Oynat/Çal düğmesinin tıklatılması gibi bir kullanıcı eylemine yanıt olarak ses çalmasını başlatıp başlatamayacağını belirler. SoundChannel sınıfı, ses verilerinin arabelleğe alınmasını yönetir, bu nedenle play() yöntemi çağrılmadan önce yeterince veri yüklenmiş olup olmadığını açıkça kontrol etmeye gerek yoktur.

onLoadProgress() yöntemi, yükleme işlemi sırasında düzenli aralıklarla çalıştırılır. Bu SoundFacade nesnesini kullanan kod tarafından kullanılmak üzere ProgressEvent nesnesinin bir klonunu gönderir.

Ses verileri tamamen yüklendiğinde onLoadComplete() yöntemi çalıştırılarak gerektiğinde akışa alınmayan sesler için play() yöntemini çağırır. play( ) yöntemi aşağıda gösterilmiştir.

public function play(pos:int = 0):void 
{ 
    if (!this.isPlaying) 
    { 
        if (this.isReadyToPlay) 
        { 
            this.sc = this.s.play(pos); 
            this.sc.addEventListener(Event.SOUND_COMPLETE, onPlayComplete); 
            this.isPlaying = true; 
             
            this.playTimer = new Timer(this.progressInterval); 
            this.playTimer.addEventListener(TimerEvent.TIMER, onPlayTimer); 
            this.playTimer.start(); 
        } 
    } 
}

play() yöntemi, ses çalınmaya hazır olduğunda Sound.play() yöntemini çağırır. Sonuçta elde edilen SoundChannel nesnesi, sc özelliğinde saklanır. Daha sonra play() yöntemi, düzenli aralıklarla çalma ilerlemesi olaylarını göndermek için kullanılacak bir Timer nesnesini oluşturur.

Çalma ilerlemesini görüntüleme

Çalmayı izlemek için bir Timer nesnesinin oluşturulması, yalnızca bir defa kodlamanız gereken karmaşık bir işlemdir. Bu Timer mantığının SoundFacade sınıfı gibi yeniden kullanılabilir bir sınıfta kapsüllenmesi, bir ses yüklenirken ve çalınırken uygulamaların aynı türdeki ilerleme olaylarını dinlemesine olanak sağlar.

SoundFacade.play() yöntemi tarafından oluşturulan Timer nesnesi, her saniye bir TimerEvent örneği gönderir. Aşağıdaki onPlayTimer() yöntemi, her yeni bir TimerEvent geldiğinde çalıştırılır:

public function onPlayTimer(event:TimerEvent):void  
{ 
    var estimatedLength:int =  
        Math.ceil(this.s.length / (this.s.bytesLoaded / this.s.bytesTotal)); 
    var progEvent:ProgressEvent =  
        new ProgressEvent(PLAY_PROGRESS, false, false, this.sc.position, estimatedLength); 
    this.dispatchEvent(progEvent); 
}

onPlayTimer() yöntemi, Çalmayı izleme bölümünde açıklanan boyut tahmini tekniğini uygular. Daha sonra bytesLoaded özelliği, SoundChannel nesnesinin geçerli konumuna ve bytesTotal özelliği de ses verisinin tahmini uzunluğuna ayarlanmış şekilde, SoundFacade.PLAY_PROGRESS olay türünde yeni bir ProgressEvent örneği oluşturur.

Çalmayı duraklatma ve yeniden başlatma

Önceden gösterilen SoundFacade.play() yöntemi, ses verisindeki bir başlangıç konumuna karşılık gelen pos parametresini kabul eder. pos değeri sıfır olursa, ses baştan çalınmaya başlar.

SoundFacade.stop() yöntemi burada gösterildiği gibi bir pos parametresini de kabul eder:

public function stop(pos:int = 0):void 
{ 
    if (this.isPlaying) 
    { 
        this.pausePosition = pos; 
        this.sc.stop(); 
        this.playTimer.stop(); 
        this.isPlaying = false; 
    }     
}

SoundFacade.stop() yöntemi her çağrıldığında pausePosition özelliğini ayarlar, böylece kullanıcı aynı sesin çalınmasını yeniden başlatmak istediğinde uygulama da oynatma kafasının nerede konumlandırıldığını bilir.

Aşağıda gösterilen SoundFacade.pause() ve SoundFacade.resume() yöntemleri sırayla SoundFacade.stop() ve SoundFacade.play() yöntemlerini çağırarak her seferinde bir pos parametre değerini iletir.

public function pause():void 
{ 
    stop(this.sc.position); 
} 
 
public function resume():void 
{ 
    play(this.pausePosition); 
}

pause() yöntemi geçerli SoundChannel.position değerini play() yöntemine iletir ve böylece bu değer pausePosition özelliğinde saklanır. resume() yöntemi, pausePosition değerini başlangıç noktası olarak kullanarak aynı sesin tekrar çalınmasını sağlar.

Podcast Player örneğini genişletme

Bu örnek, yeniden kullanılabilir SoundFacade sınıfının kullanılmasını gösteren temel bir Podcast Player uygulamasını sunmaktadır. Bu uygulamanın kullanışlılığını artırmak için aşağıdaki gibi başka ek özellikler de ekleyebilirsiniz:

  • Kullanıcı bir dahaki sefer uygulamayı çalıştırdığında kullanılabilen bir SharedObject örneğinde beslemelerin listesini ve her bölümle ilgili kullanım bilgilerini saklama.

  • Kullanıcının podcast kanallarının listesine kendi RSS beslemelerini eklemesine olanak sağlama.

  • Kullanıcı bir bölümü durdurduğunda veya bir bölümden çıktığında oynatma kafasının konumunu hatırlama ve böylece kullanıcı uygulamayı bir dahaki sefer çalıştırdığında o noktadan başlanabilmesini sağlama.

  • Internet bağlantısı olmadığında çevrimdışı da dinlenmesi için bölümlerin mp3 dosyalarını indirme.

  • Podcast kanalında yeni bölümleri düzenli aralıklarla kontrol edip bölüm listesini otomatik olarak güncelleyen ek abonelik özellikleri ekleme.

  • API kullanılarak Odeo.com gibi bir podcast barındırma hizmetinden podcast arama ve göz atma işlevselliği ekleme.