套件flash.media
類別public class Sound
繼承Sound Inheritance EventDispatcher Inheritance Object

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

Sound 類別可讓您使用應用程式中的聲音。 Sound 類別可讓您建立新的 Sound 物件、將外部 MP3 檔載入該物件並進行播放、關閉聲音串流,並存取有關聲音的資料,例如串流的位元組數目和 ID3 中繼資料。 更詳細的聲音控制是透過聲音來源 (聲音的 SoundChannel 或 Microphone 物件),以及 SoundTransform 類別中控制電腦喇叭聲音輸出的屬性來進行。

若要控制內嵌在 SWF 檔中的聲音,請使用 SoundMixer 類別中的屬性。

注意: ActionScript 3.0 的 Sound API 與 ActionScript 2.0 的不同。 在 ActionScript 3.0 中,您無法使用 Sound 物件並將它們排列在階層中,以控制其屬性。

使用此類別時,必須顧及 Flash Player 安全性模型:

如需詳細資訊,請參閱下列章節:

檢視範例

請參閱

Microphone
SoundChannel
SoundMixer
SoundTransform
使用聲音的基本概念


公用 屬性
 屬性定義自
  bytesLoaded : uint
[read-only] 會傳回此 Sound 物件中目前可用的位元組數目。
Sound
  bytesTotal : int
[read-only] 會傳回此 Sound 物件中的位元組總數。
Sound
 Inheritedconstructor : Object
類別物件的參照或是特定物件實體的建構函數。
Object
  id3 : ID3Info
[read-only] 提供存取屬於 MP3 檔一部份的中繼資料。
Sound
  isBuffering : Boolean
[read-only] 會傳回外部 MP3 檔的緩衝狀態。
Sound
  length : Number
[read-only] 目前聲音的長度,以毫秒為單位。
Sound
 Inheritedprototype : Object
[static] 類別或函數物件之原型物件的參照。
Object
  url : String
[read-only] 從中載入此聲音的 URL。
Sound
公用 方法
 方法定義自
  
Sound(stream:URLRequest = null, context:SoundLoaderContext = null)
會建立新的 Sound 物件。
Sound
 Inherited
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
會在 EventDispatcher 物件註冊事件偵聽程式¡以便讓偵聽程式收到事件的通知。
EventDispatcher
  
會關閉串流,因而導致資料的下載作業終止。
Sound
 Inherited
會將事件傳送到事件流程。
EventDispatcher
 Inherited
會檢查 EventDispatcher 物件是否有對特定的事件類型註冊偵聽程式。
EventDispatcher
 Inherited
指出物件是否有已定義的指定屬性。
Object
 Inherited
指出 Object 類別的實體是否位於指定為參數的物件原型鏈中。
Object
  
load(stream:URLRequest, context:SoundLoaderContext = null):void
起始會從指定 URL 載入外部 MP3 檔的作業。
Sound
  
play(startTime:Number = 0, loops:int = 0, sndTransform:SoundTransform = null):SoundChannel
會產生新的 SoundChannel 物件,以便播放聲音。
Sound
 Inherited
指出指定的屬性是否存在,以及是否可列舉。
Object
 Inherited
removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
會從 EventDispatcher 物件移除偵聽程式。
EventDispatcher
 Inherited
為迴圈作業設定動態屬性的可用性。
Object
 Inherited
會傳回指定之物件的字串形式。
Object
 Inherited
會傳回指定之物件的基本值。
Object
 Inherited
檢查此 EventDispatcher 物件是否已註冊為事件偵聽程式,或者此物件的任何祖先已註冊為特定的事件類型。
EventDispatcher
事件
 事件 摘要 定義自
 Inherited 當 Flash Player 取得作業系統焦點並成為作用中狀態時傳送。EventDispatcher
   在順利載入資料時傳送。Sound
 Inherited 當 Flash Player 失去作業系統焦點並成為停用狀態時傳送。EventDispatcher
  
id3
當 ID3 資料可用於 MP3 聲音時,由 Sound 物件傳送。Sound
   發生輸入/輸出錯誤,因而導致載入作業失敗時傳送。Sound
   在載入作業開始時傳送。Sound
   在載入作業進行中收到資料時傳送。Sound
屬性詳細資訊
bytesLoaded屬性
bytesLoaded:uint  [read-only]

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

會傳回此 Sound 物件中目前可用的位元組數目。 這通常僅適用於外部載入的檔案。


實作
    public function get bytesLoaded():uint
bytesTotal屬性 
bytesTotal:int  [read-only]

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

會傳回此 Sound 物件中的位元組總數。


實作
    public function get bytesTotal():int
id3屬性 
id3:ID3Info  [read-only]

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

提供存取屬於 MP3 檔一部份的中繼資料。

MP3 聲音檔案可包含 ID3 標籤,此標籤可提供關於檔案的中繼資料。 如果使用 Sound.load() 方法所載入的 MP3 聲音包含 ID3 標籤,您就可以查詢這些屬性, 只支援使用 UTF-8 字元集的 ID3 標籤。

Flash Player 9 和更新版本都可支援 2.0 版 (特別是 2.3 和 2.4) 的 ID3 標籤。 下表列出標準 2.0 版的 ID3 標籤,以及這些標籤所代表的內容類型。 Sound.id3 屬性可透過 my_sound.id3.COMMmy_sound.id3.TIME 等格式存取這些標籤。 第一份表格將說明可透過 2.0 版 ID3 屬性名稱或 ActionScript 屬性名稱存取的標籤。 第二份表格將說明受支援但在 ActionScript 中沒有預先定義屬性的 ID3 標籤。

2.0 版 ID3 標籤對應的 ActionScript 屬性
COMMSound.id3.comment
TALBSound.id3.album
TCONSound.id3.genre
TIT2Sound.id3.songName
TPE1Sound.id3.artist
TRCKSound.id3.track
TYERSound.id3.year

下表將說明受支援但在 ActionScript 中沒有預先定義屬性的 ID3 標籤。 您可以透過呼叫 mySound.id3.TFLTmySound.id3.TIME 等格式,存取這些標籤。

屬性說明
TFLT檔案類型
時間時間
TIT1內容群組說明
TIT2標題/曲名/內容說明
TIT3字幕/說明技術指導
TKEY初始按鍵
TLAN語言
TLEN長度
TMED媒體類型
TOAL原始的專輯/影片/表演名稱
TOFN原始檔名
TOLY原始歌詞/文字作者
TOPE原始藝人/表演者
TORY原始發佈年份
TOWN檔案擁有者/授權者
TPE1領銜表演者/獨唱者
TPE2樂團/交響樂團/伴奏
TPE3指揮/表演者技術指導
TPE4解譯、合成或其他修改者
TPOS部分專輯
TPUB發行者
TRCK專輯的曲目編號/位置
TRDA錄音日期
TRSN網路電台名稱
TRSO網路電台擁有者
TSIZ大小
TSRCISRC (國際標準錄音碼)
TSSE編碼用的軟體/硬體和設定
TYER
WXXXURL 連結影格

使用此屬性時,必須顧及 Flash Player 安全性模型:

如需詳細資訊,請參閱下列章節:


實作
    public function get id3():ID3Info

請參閱


範例

下列範例會從聲音檔案讀取 ID3 資訊,並將資訊顯示在文字欄位中。

建構函式會載入聲音檔案,但不將它設定為開始播放。 這裡假設該檔案位在 SWF 目錄中。 系統必須具有權限,才能讀取已載入聲音檔案的 ID3 標籤。 如果檔案中有 ID3 資訊,而且程式有讀取權限,就會觸發 Event.ID3 事件,而且會填入聲音檔案的 id3 屬性。 id3 屬性包含 ID3Info 物件,內含所有 ID3 資訊。

id3Handler() 方法中,檔案的 ID3 標籤儲存在 ID3Info 類別物件 id3 中。 範例會實體化一個文字欄位,以顯示 ID3 標籤的清單。 for 迴圈會重複執行所有 ID3 2.0 標籤,並將名稱和值附加到文字欄位的內容後面。 如果使用 ID3 資訊 (ID3Info) 屬性,也可以附加藝人、歌曲名稱和專輯。 ActionScript 3.0 與 Flash Player 9 和更新版本皆支援 ID3 2.0 標籤,尤其是 2.3 和 2.4。如果您以類似 for 迴圈的方式重複執行各個屬性,就只會顯示 ID3 2.0 標籤。 但是,舊版的資料也會儲存在歌曲的 id3 屬性中,而且可以使用 ID3 資訊類別屬性存取。 ID3 1.0 的標籤位於檔案末端,而 ID3 2.0 標籤則位於檔案開頭 (有時候,檔案裡可能同時有舊版本和新版本的標籤)。 如果檔案的編碼是在檔案開頭和末端同時有版本 1.0 和 2.0 的標籤,則 id3Handler() 方法會叫用兩次。 它會先讀取版本 2.0,再讀取版本 1.0。如果只有 ID3 1.0 的標籤,就可以透過 ID3 資訊屬性 (例如 id3.songname) 存取資訊。 對於 ID3 2.0,id3.TITS 屬性會使用新的標籤 (TITS) 擷取歌曲名稱。

請注意,這個範例沒有錯誤處理功能,如果 ID3 內容太長,結果可能會超出可檢視區域。

package {
    import flash.display.Sprite;
    import flash.media.Sound;
    import flash.net.URLRequest;
    import flash.media.ID3Info;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.events.Event;

    public class Sound_id3Example extends Sprite {
        private var snd:Sound = new Sound();       
        private var myTextField:TextField = new TextField();

        public function Sound_id3Example() {
            snd.addEventListener(Event.ID3, id3Handler);
            snd.load(new URLRequest("mySound.mp3"));
        }
    
        private function id3Handler(event:Event):void {
            var id3:ID3Info = snd.id3;

            myTextField.autoSize = TextFieldAutoSize.LEFT;
            myTextField.border = true;

            myTextField.appendText("Received ID3 Info: \n");
              
            for (var propName:String in id3) {
                myTextField.appendText(propName + " = " + id3[propName] + "\n");
            }
 
            myTextField.appendText("\n" + "Artist: " + id3.artist + "\n");
            myTextField.appendText("Song name: " + id3.songName + "\n");
            myTextField.appendText("Album: " + id3.album + "\n\n"); 
 
            this.addChild(myTextField);
        }
    }
}
isBuffering屬性 
isBuffering:Boolean  [read-only]

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

會傳回外部 MP3 檔的緩衝狀態。 如果此值為 true,物件會在等候更多資料期間,暫停任何播放動作。


實作
    public function get isBuffering():Boolean
length屬性 
length:Number  [read-only]

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

目前聲音的長度,以毫秒為單位。


實作
    public function get length():Number
url屬性 
url:String  [read-only]

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

從中載入此聲音的 URL。 這個屬性僅適用於使用 Sound.load() 方法載入的 Sound 物件。 若為與 SWF 元件庫中聲音資源相關聯的 Sound 物件,url 屬性值就是 null

當您首次呼叫 Sound.load() 時,url 屬性最初會具有 null 值,因為最終 URL 尚不明。 一旦 open 事件從 Sound 物件傳送時,url 屬性就會具有非 null 值。

url 屬性含有從中載入聲音的最終絕對 URL。 url 的值通常都會與傳遞給 Sound.load()stream 參數的值相同。 不過,如果您將相對 URL 傳遞給 Sound.load()url 屬性值就會表示為絕對 URL。 此外,如果原始 URL 要求由 HTTP 伺服器重新導向,url 屬性值就會反映實際從中下載聲音檔的最終 URL。 這種絕對最終 URL 的回報方式就相當於 LoaderInfo.url 的行為。


實作
    public function get url():String

請參閱

建構函式詳細資訊
Sound()建構函式
public function Sound(stream:URLRequest = null, context:SoundLoaderContext = null)

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

會建立新的 Sound 物件。 如果您將有效的 URLRequest 物件傳遞給 Sound 建構函式,此建構函式就會自動為 Sound 物件呼叫 load() 函數。 如果您並未將有效的 URLRequest 物件傳遞給 Sound 建構函式,就必須自行為 Sound 物件呼叫 load() 函數,否則串流將不會載入該物件。

一旦針對 Sound 物件呼叫 load(),您就無法在稍後將不同的聲音檔載入該 Sound 物件。 若要載入不同的聲音檔,請建立新的 Sound 物件。

參數
stream:URLRequest (default = null) — 指向外部 MP3 檔案的 URL。
 
context:SoundLoaderContext (default = null) — 要在 Sound 物件緩衝區中存放 MP3 資料的最小毫秒數。 Sound 物件會等到它至少存放了這些資料之後,再開始播放,並於網路延遲後繼續播放。 預設值為 1000 (一秒)。
方法詳細資訊
close()方法
public function close():void

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

會關閉串流,因而導致資料的下載作業終止。 在呼叫 close() 方法後,便無法從串流讀取任何資料。


擲回值
IOError — 串流無法關閉,或者該串流尚未開啟。

範例

在下列範例中,當使用者按一下「停止」按鈕時,會呼叫 Sound.close() 方法,並停止聲音的串流處理。

建構函式會為「開始」和「停止」按鈕建立文字欄位。 當使用者按一下文字欄位時,會叫用 clickHandler() 方法。 它會處理聲音檔案的開始和停止播放。 請注意,依網路連線或使用者按「停止」按鈕的時間而定,檔案可能已經載入一大半,所以必須經過一段時間後,聲音檔案才會停止播放。 try...catch 區塊會用來捕捉關閉串流期間可能發生的任何 IO 錯誤。 例如,如果聲音是從本機目錄載入,且未經過串流處理,就會捕捉到錯誤 2029,訊息是「此 URLStream 物件沒有開啟的串流」。

 
package {
    import flash.display.Sprite;
    import flash.net.URLRequest;
    import flash.media.Sound;    
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.events.MouseEvent;
    import flash.errors.IOError;
    import flash.events.IOErrorEvent;

    public class Sound_closeExample extends Sprite {
        private var snd:Sound = new Sound();
        private var button:TextField = new TextField();
        private var req:URLRequest = new URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3");
        
        public function Sound_closeExample() {
            button.x = 10;
            button.y = 10;
            button.text = "START";
            button.border = true;
            button.background = true;
            button.selectable = false;
            button.autoSize = TextFieldAutoSize.LEFT;

            button.addEventListener(MouseEvent.CLICK, clickHandler);

            this.addChild(button);
        }

        private function clickHandler(e:MouseEvent):void {

            if(button.text == "START") {

                snd.load(req);
                snd.play();        

                snd.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);

                button.text = "STOP";
            }
            else if(button.text == "STOP") {
                    
                try {
                    snd.close();
                    button.text = "Wait for loaded stream to finish.";
                }
                catch (error:IOError) {
                    button.text = "Couldn't close stream " + error.message;    
                }
            }
        }
        
        private function errorHandler(event:IOErrorEvent):void {
                button.text = "Couldn't load the file " + event.text;
        }
    }
}


load()方法 
public function load(stream:URLRequest, context:SoundLoaderContext = null):void

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

起始會從指定 URL 載入外部 MP3 檔的作業。 如果您將有效的 URLRequest 物件提供給 Sound 建構函式,此建構函式就會為您呼叫 Sound.load()。 如果您並未將有效的 URLRequest 物件傳遞給 Sound 建構函式,或者傳遞的是 null 值,就必須自行呼叫 Sound.load()

一旦針對 Sound 物件呼叫 load(),您就無法在稍後將不同的聲音檔載入該 Sound 物件。 若要載入不同的聲音檔,請建立新的 Sound 物件。

使用此方法時,必須顧及 Flash Player 安全性模型:

如需詳細資訊,請參閱下列章節:

參數

stream:URLRequest — 指向外部 MP3 檔的 URL。
 
context:SoundLoaderContext (default = null) — 要在 Sound 物件緩衝區中存放 MP3 資料的最小毫秒數。 Sound 物件會等到它至少存放了這些資料之後,再開始播放,並於網路延遲後繼續播放。 預設值為 1000 (一秒)。


擲回值
IOError — 導致載入失敗的網路錯誤。
 
SecurityError — 本機不受信任的 SWF 檔可能無法與網際網路進行通訊。 您可以透過將此 SWF 檔重新分類為「具有網路連線的本機」或受信任,解決此問題。

請參閱


範例

下列範例會顯示聲音檔案的載入進度。

建構函式中會建立 URLRequest 物件,以識別聲音檔案 (來自 Adobe 的 Podcast) 的位置。 檔案於 try...catch 區塊中載入,以捕捉載入檔案期間可能發生的任何錯誤。 如果發生 IO 錯誤,也會叫用 errorHandler() 方法,並將錯誤訊息寫入文字欄位,做為進度報告之用。 載入作業進行時,會傳送 ProgressEvent.PROGRESS 事件並呼叫 progressHandler() 方法。 這裡使用 ProgressEvent.PROGRESS 事件做為計算載入進度的計時器。

progressHandler() 方法會將使用 ProgressEvent 物件傳遞的 bytesLoaded 值除以 bytesTotal 值,得出聲音檔案的載入百分比。 接著,它會在文字欄位中顯示這些值 (請注意,如果檔案太小、已快取或位於本機目錄中,則進度可能不太明顯)。

package {
    import flash.display.Sprite;
    import flash.net.URLRequest;
    import flash.media.Sound;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.events.ProgressEvent;
    import flash.events.IOErrorEvent;
    
    public class Sound_loadExample extends Sprite {
        private var snd:Sound = new Sound();
        private var statusTextField:TextField  = new TextField();

        public function Sound_loadExample(){

            statusTextField.autoSize = TextFieldAutoSize.LEFT;
            var req:URLRequest = new URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3");
            
            try {
            snd.load(req);
            
            snd.play();
            }
            catch (err:Error) {
                trace(err.message);
            }
 
            snd.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
            snd.addEventListener(ProgressEvent.PROGRESS, progressHandler);
                     
            this.addChild(statusTextField);
        }
    
        private function progressHandler(event:ProgressEvent):void {
            var loadTime:Number = event.bytesLoaded / event.bytesTotal;
            var LoadPercent:uint = Math.round(100 * loadTime);
              
            statusTextField.text = "Sound file's size in bytes: " + event.bytesTotal + "\n" 
                                 + "Bytes being loaded: " + event.bytesLoaded + "\n" 
                                 + "Percentage of sound file that is loaded " + LoadPercent + "%.\n";
        }
 
        private function errorHandler(errorEvent:IOErrorEvent):void {
            statusTextField.text = "The sound could not be loaded: " + errorEvent.text;
        }
    }
}
play()方法 
public function play(startTime:Number = 0, loops:int = 0, sndTransform:SoundTransform = null):SoundChannel

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

會產生新的 SoundChannel 物件,以便播放聲音。 這個方法會傳回 SoundChannel 物件,您可以存取此物件,以停止聲音並監視音量 (若要控制音量、左右相位和平衡,請存取指定給聲道的 SoundTransform 物件)。

參數

startTime:Number (default = 0) — 應該開始進行播放作業的初始位置,以毫秒為單位。
 
loops:int (default = 0) — 會定義聲音在聲道停止播放之前,重複回到 startTime 值的次數。
 
sndTransform:SoundTransform (default = null) — 指定給聲道的初始 SoundTransform 物件。

傳回值
SoundChannel — 可讓您用來控制聲音的 SoundChannel 物件。 如果您沒有音效卡,或是沒有可用的聲道,這個方法就會傳回 null。 一次可用的最大聲道數目為 32。

請參閱


範例

在下列範例中,使用者可以在檔案載入後,使用圖形列選取聲音檔案的開始位置 (開始時間)。

建構函式會呼叫 Sound.load() 方法,開始載入聲音資料。 接著,它會呼叫 Sound.play() 方法,這個方法一等到有足夠的資料載入後就會開始播放聲音。 Sound.play() 方法會傳回 SoundChannel 物件,可用來控制聲音的播放。 文字欄位會顯示指示。 為確保已經載入使用者希望開始播放的聲音內容,所以會建立 bar Sprite 物件,並在檔案完成載入後顯示出來。 檔案成功載入時會傳送 Event.COMPLETE 事件,以觸發 completeHandler() 方法。 接著,completeHandler() 方法會建立橫列,並將它加入播放清單 (不用 Shape 物件,改用 Sprite 物件以支援互動性)。 當使用者按一下橫列時,會觸發 clickHandler() 方法。

clickHandler() 方法中,使用者按一下時的 x 座標位置 event.localX 會被用來決定檔案中使用者要開始播放的位置。 由於橫列的大小是 100 個像素,而且它從 x 座標 100 像素開始,因此很容易決定位置的百分比。 而且,因為檔案已經載入,所以聲音檔案的 length 屬性會有完整檔案的長度 (以毫秒為單位)。 使用聲音檔案的長度和在該行中的位置,可以決定聲音檔案的開始位置。 停止播放聲音後,聲音檔案會從選取的開始位置 (這已當成 startTime 參數傳遞到 play() 方法) 重新開始。

 
package {
    import flash.display.Sprite;
    import flash.display.Graphics;
    import flash.events.MouseEvent;
    import flash.media.Sound;;
    import flash.net.URLRequest;
    import flash.media.SoundChannel;
    import flash.events.ProgressEvent;
    import flash.events.Event;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.events.IOErrorEvent;
    
    public class Sound_playExample1 extends Sprite {
        private var snd:Sound = new Sound();
        private var channel:SoundChannel = new SoundChannel();
        private var infoTextField:TextField = new TextField();
    
        public function Sound_playExample1() {

            var req:URLRequest = new URLRequest("MySound.mp3");
            
            infoTextField.autoSize = TextFieldAutoSize.LEFT;
            infoTextField.text = "Please wait for the file to be loaded.\n" 
                                + "Then select from the bar to decide where the file should start.";
            
            snd.load(req);               
            channel = snd.play();

            snd.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
            snd.addEventListener(Event.COMPLETE, completeHandler);


            this.addChild(infoTextField);
        }

        private function completeHandler(event:Event):void {                
            infoTextField.text = "File is ready.";

            var bar:Sprite = new Sprite();

            bar.graphics.lineStyle(5, 0xFF0000);
            bar.graphics.moveTo(100, 100);
            bar.graphics.lineTo(200, 100);

            bar.addEventListener(MouseEvent.CLICK, clickHandler);

            this.addChild(bar);
        }
    
        private function clickHandler(event:MouseEvent):void {
            
                var position:uint = event.localX;
                var percent:uint = Math.round(position) - 100;   
                var cue:uint = (percent / 100) * snd.length;

                channel.stop();
                channel = snd.play(cue);    
        }

        private function errorHandler(errorEvent:IOErrorEvent):void {
            infoTextField.text = "The sound could not be loaded: " + errorEvent.text;
        }
    }
}

下列範例會根據使用者按一下或按兩下按鈕,決定將聲音播放一次或兩次。

建構函式會載入聲音,並建立簡單的矩形 button Sprite 物件 (不用 Shape 物件,改用 Sprite 物件以支援互動性)。 這裡假設該聲音檔案與 SWF 檔在相同目錄中 (這個範例沒有錯誤處理程式碼)。

範例中設定了兩個事件偵聽程式,以回應按一下滑鼠和按兩下滑鼠。 如果使用者按一下,就會叫用播放聲音的 clickHandler() 方法。 如果使用者按兩下按鈕,則會叫用播放兩次聲音檔案的 doubleClickHandler() 方法。 play() 方法的第二個引數會設定為 1,表示聲音會繞回聲音的開始時間,重新播放一次。 第一個引數 (開始時間) 設定為 0,表示檔案將從頭開始播放。

package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.media.Sound;
    import flash.net.URLRequest;

    public class Sound_playExample2 extends Sprite {
        private var button:Sprite = new Sprite(); 
        private var snd:Sound = new Sound();
            
        public function Sound_playExample2() {

            var req:URLRequest = new URLRequest("click.mp3");
            snd.load(req);               
     
            button.graphics.beginFill(0x00FF00);
            button.graphics.drawRect(10, 10, 50, 30);
            button.graphics.endFill();
     
            button.addEventListener(MouseEvent.CLICK, clickHandler);
            button.addEventListener(MouseEvent.DOUBLE_CLICK, doubleClickHandler);
     
            this.addChild(button);
        }

        private function clickHandler(event:MouseEvent):void {
            snd.play();            
        }

        private function doubleClickHandler(event:MouseEvent):void {
            snd.play(0, 2);        
        }
    }
}

下列範例會顯示聲音檔案的載入和播放進度。

在建構函式中,檔案於 try...catch 區塊中載入,以捕捉載入檔案期間可能發生的任何錯誤。 範例中為聲音物件加入偵聽程式,這個偵聽程式會呼叫 errorHandler() 方法來回應 IOErrorEvent 事件。 範例中為主應用程式加入了另一個偵聽程式,這個偵聽程式會回應 Event.ENTER_FRAME 事件,做為顯示播放進度的計時機制。 最後,會為聲道加入第三個偵聽程式,藉由呼叫 soundCompleteHandler() 方法來回應 Event.SOUND_COMPLETE 事件 (當聲音播放完畢時)。 soundCompleteHandler() 方法也會移除 Event.ENTER_FRAME 事件的事件偵聽程式。

enterFrameHandler() 方法會將使用 ProgressEvent 物件傳遞的 bytesLoaded 值除以 bytesTotal 值,得出聲音檔案的載入百分比。 聲音資料的播放百分比可以用聲道的 position 屬性值除以聲音資料的長度來決定。 但是,如果聲音資料還未完全載入,則聲音物件的 length 屬性只會顯示目前已載入的聲音資料大小。 範例中會計算完整聲音檔案最後的估計大小,方法是將目前聲音物件的 length 除以 bytesLoaded 屬性值,再除以 bytesTotal 屬性值。

請注意,如果檔案太小、已快取或位於本機目錄中,則載入進度可能不太明顯。 此外,從聲音資料開始載入到載入的資料開始播放,這中間的延遲時間是由 SoundLoaderContext.buffertime 屬性的值所決定,這個值預設為 1000 毫秒,而且可以重設。

package {
    import flash.display.Sprite;
    import flash.net.URLRequest;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    
    public class Sound_playExample3 extends Sprite {
        private var snd:Sound = new Sound();
        private var channel:SoundChannel;
        private var statusTextField:TextField  = new TextField();

        public function Sound_playExample3(){

            statusTextField.autoSize = TextFieldAutoSize.LEFT;

           var req:URLRequest = new URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3");
            
            try {
                snd.load(req);
            
                channel = snd.play();
            }
            catch (err:Error) {
                trace(err.message);
            }
                    
            snd.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            channel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
                    
            this.addChild(statusTextField);
        }
    
        private function enterFrameHandler(event:Event):void {    
            var loadTime:Number = snd.bytesLoaded / snd.bytesTotal;
            var loadPercent:uint = Math.round(100 * loadTime);
            var estimatedLength:int = Math.ceil(snd.length / (loadTime));
            var playbackPercent:uint = Math.round(100 * (channel.position / estimatedLength));
      
            statusTextField.text = "Sound file's size is " + snd.bytesTotal + " bytes.\n" 
                                   + "Bytes being loaded: " + snd.bytesLoaded + "\n" 
                                   + "Percentage of sound file that is loaded " + loadPercent + "%.\n"
                                   + "Sound playback is " + playbackPercent + "% complete.";     
        }
 
        private function errorHandler(errorEvent:IOErrorEvent):void {
            statusTextField.text = "The sound could not be loaded: " + errorEvent.text;
        }

        private function soundCompleteHandler(event:Event):void {
            statusTextField.text = "The sound has finished playing.";
            removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
    }
}
事件詳細資訊
complete 事件
事件物件類型: flash.events.Event
Event.type property = flash.events.Event.COMPLETE

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

在順利載入資料時傳送。

定義 complete 事件物件的 type 屬性值。

這個事件具有下列屬性:

屬性
bubblesfalse
cancelablefalse;沒有要取消的預設行為指令。
currentTarget以事件偵聽程式主動處理 Event 物件的物件。
target已完成載入的網路物件。

請參閱

id3 事件  
事件物件類型: flash.events.Event
Event.type property = flash.events.Event.ID3

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

當 ID3 資料可用於 MP3 聲音時,由 Sound 物件傳送。

定義 id3 事件物件的 type 屬性值。

這個事件具有下列屬性:

屬性
bubblesfalse
cancelablefalse;沒有要取消的預設行為指令。
currentTarget以事件偵聽程式主動處理 Event 物件的物件。
target載入目前可使用 ID3 資料之 MP3 的 Sound 物件。 target 不會永遠都是顯示清單中註冊事件偵聽程式的物件。 請使用 currentTarget 屬性,存取目前正在處理該事件之顯示清單中的物件。

請參閱

ioError 事件  
事件物件類型: flash.events.IOErrorEvent
IOErrorEvent.type property = flash.events.IOErrorEvent.IO_ERROR

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

發生輸入/輸出錯誤,因而導致載入作業失敗時傳送。

定義 ioError 事件物件的 type 屬性值。

這個事件具有下列屬性:

屬性
bubblesfalse
cancelablefalse;沒有要取消的預設行為指令。
currentTarget以事件偵聽程式主動處理 Event 物件的物件。
target遭遇輸入/輸出錯誤的網路物件。
text要顯示為錯誤訊息的文字。

請參閱

open 事件  
事件物件類型: flash.events.Event
Event.type property = flash.events.Event.OPEN

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

在載入作業開始時傳送。

定義 open 事件物件的 type 屬性值。

這個事件具有下列屬性:

屬性
bubblesfalse
cancelablefalse;沒有要取消的預設行為指令。
currentTarget以事件偵聽程式主動處理 Event 物件的物件。
target已開啟連線的網路物件。

請參閱

progress 事件  
事件物件類型: flash.events.ProgressEvent
ProgressEvent.type property = flash.events.ProgressEvent.PROGRESS

語言版本 : ActionScript 3.0
Player 版本 : Flash Player 9

在載入作業進行中收到資料時傳送。

定義 progress 事件物件的 type 屬性值。

這個事件具有下列屬性:

屬性
bubblesfalse
bytesLoaded在偵聽程式處理事件時¡載入的項目或位元組數目。
bytesTotal如果載入程序成功時,最終將載入的項目或位元組總數。
cancelablefalse;沒有要取消的預設行為指令。
currentTarget以事件偵聽程式主動處理 Event 物件的物件。
target回報進度的網路物件。

請參閱

範例 如何使用範例
SoundExample.as

下列範例會顯示在開啟並播放 MP3 檔時,所發生之聲音事件的相關資訊。 若要執行此範例,請將名為 MySound.mp3 的檔案與 SWF 檔放置於相同的目錄中。
package {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.net.URLRequest;

    public class SoundExample extends Sprite {
        private var url:String = "MySound.mp3";
        private var song:SoundChannel;

        public function SoundExample() {
            var request:URLRequest = new URLRequest(url);
            var soundFactory:Sound = new Sound();
            soundFactory.addEventListener(Event.COMPLETE, completeHandler);
            soundFactory.addEventListener(Event.ID3, id3Handler);
            soundFactory.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            soundFactory.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            soundFactory.load(request);
            song = soundFactory.play();
        }

        private function completeHandler(event:Event):void {
            trace("completeHandler: " + event);
        }

        private function id3Handler(event:Event):void {
            trace("id3Handler: " + event);
        }

        private function ioErrorHandler(event:Event):void {
            trace("ioErrorHandler: " + event);
        }

        private function progressHandler(event:ProgressEvent):void {
            trace("progressHandler: " + event);
        }
    }
}




 

有新的意見加入至這個頁面時,傳送電子郵件給我 | 意見報告

目前頁面: http://livedocs.adobe.com/flash/9.0_tw/ActionScriptLangRefV3/flash/media/Sound.html