載入外部聲音檔案

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

每個 Sound 類別的實體都是用來載入特定聲音資源並觸發播放動作。應用程式無法重複使用 Sound 物件來載入多個聲音。如果想要載入新的聲音資源,就必須建立新的 Sound 物件。

如果您正在載入小型聲音檔案,例如要附加至按鈕的按一下聲音,應用程式可以建立新的 Sound,並讓它自動載入聲音檔案,如下所示:

var req:URLRequest = new URLRequest("click.mp3"); 
var s:Sound = new Sound(req);

Sound() 建構函式會接受 URLRequest 物件做為它的第一個參數。當提供 URLRequest 參數的值時,新的 Sound 物件便會開始自動載入指定的聲音資源。

除了最簡單的例子以外,應用程式都應該注意聲音的載入進度,並在載入期間注意是否發生錯誤。例如,假設按一下聲音所佔的大小相當大,則可能在使用者按一下觸發該聲音的按鈕時,該聲音仍尚未完全載入。嘗試播放未載入的聲音可能會造成執行階段錯誤,因此,最好能等聲音完全載入,再讓使用者採取可能開始播放聲音的行動。

Sound 物件會在聲音載入程序期間傳送一些不同的事件。您的應用程式可以偵聽這些事件以追蹤載入進度,並確定在播放之前聲音已完全載入。下表列出 Sound 物件可以傳送的事件。

事件

說明

open (Event.OPEN)

在聲音載入作業開始之前立即傳送。

progress (ProgressEvent.PROGRESS)

從檔案或串流接收資料時,在聲音載入過程中定期傳送。

id3 (Event.ID3)

當 MP3 聲音有 ID3 資料可用時傳送。

complete (Event.COMPLETE)

已載入所有聲音資源的資料時傳送。

ioError (IOErrorEvent.IO_ERROR)

找不到聲音檔案,或是在接收所有聲音資料之前中斷載入程序時傳送。

下列程式碼說明聲音完成載入之後的播放方式:

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var s:Sound = new Sound(); 
s.addEventListener(Event.COMPLETE, onSoundLoaded); 
var req:URLRequest = new URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onSoundLoaded(event:Event):void 
{ 
    var localSound:Sound = event.target as Sound; 
    localSound.play(); 
}

首先,此程式碼樣本會建立新的 Sound 物件,並且不會為 URLRequest 參數指定初始值。接著,它會偵聽 Sound 物件的 Event.COMPLETE 事件,該事件會在所有聲音資料都已載入時執行 onSoundLoaded() 方法。然後,它會呼叫 Sound.load() 方法,並搭配該聲音檔案的新 URLRequest 值。

當聲音載入完成時,就會執行 onSoundLoaded() 方法。Event 物件的 target 屬性是 Sound 物件的參考。呼叫 Sound 物件的 play() 方法,然後開始播放聲音。

監視聲音載入的過程

聲音檔案有可能很大,而且需要很長的時間才能載入。當 Flash Player 和 AIR 應用程式甚至在未完全載入聲音之前就已開始播放,您可能會想要提示使用者,指出已載入的聲音資料進度,以及已播放聲音的進度。

Sound 類別會傳送下列兩個事件,進而讓聲音的載入進度顯示變得相當容易:ProgressEvent.PROGRESSEvent.COMPLETE。下列範例將說明如何使用這些事件,顯示關於載入聲音的進度資訊:

import flash.events.Event; 
import flash.events.ProgressEvent; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var s:Sound = new Sound(); 
s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); 
s.addEventListener(Event.COMPLETE, onLoadComplete); 
s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
 
var req:URLRequest = new URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onLoadProgress(event:ProgressEvent):void 
{ 
    var loadedPct:uint =         Math.round(100 * (event.bytesLoaded / event.bytesTotal)); 
    trace("The sound is " + loadedPct + "% loaded."); 
} 
 
function onLoadComplete(event:Event):void 
{ 
    var localSound:Sound = event.target as Sound; 
    localSound.play(); 
} 
function onIOError(event:IOErrorEvent) 
{ 
    trace("The sound could not be loaded: " + event.text); 
}

此程式碼首先會為 ProgressEvent.PROGRESSEvent.COMPLETE 事件建立 Sound 物件,然後將偵聽程式加入該物件。在呼叫 Sound.load() 方法並且從聲音檔案接收第一份資料之後,就會發生 ProgressEvent.PROGRESS 事件,並觸發 onSoundLoadProgress() 方法。

已載入的聲音資料之百分比等於 ProgressEvent 物件的 bytesLoaded 屬性值除以 bytesTotal 屬性值。在 Sound 物件上也可以使用相同的 bytesLoadedbytesTotal 屬性。上述範例只是顯示聲音載入進度的訊息,但是您可以輕鬆地使用 bytesLoadedbytesTotal 值以更新進度列組件,例如 Adobe Flex 架構或 Adobe Flash 編寫工具隨附的組件。

此範例也會說明在載入聲音檔案時,應用程式如何辨識和回應錯誤。例如,如果找不到指定檔案名稱的聲音檔案,Sound 物件就會傳送 Event.IO_ERROR 事件。在上述程式碼中,發生錯誤時,就會執行 onIOError() 方法,並顯示簡短的錯誤訊息。