应用程序可能需要了解何时停止播放某种声音,以便开始播放另一种声音,或者清除在以前
回放期间使用的某些资源。SoundChannel 类在其声音完成播放时将调度

Event.SOUND_COMPLETE 事件。应用程序可以侦听此事件并执行相应的动作,如下所示: 
 
 import flash.events.Event; 
 
 import flash.media.Sound; 
 
 import flash.net.URLRequest; 
 
 var snd:Sound = new Sound("smallSound.mp3"); 
 
 var channel:SoundChannel = snd.play(); 
 
 s.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
 
 public function onPlaybackComplete(event:Event) 
 
 { 
 
 trace(“The sound has finished playing.”); 
 
 }


SoundChannel 类在回放期间不调度进度事件。要报告回放进度,应用程序可以设置其自己
的计时机制并跟踪声音播放头的位置。
要计算已播放的声音百分比,您可以将 SoundChannel.position 属性值除以所播放的声音
数据长度:
var playbackPercent:uint = 100 * (channel.position / snd.length);
但是,仅当在开始回放之前完全加载了声音数据,此代码才会报告精确的回放百分比。
Sound.length 属性显示当前加载的声音数据的大小,而不是整个声音文件的最终大小。要
跟踪仍在加载的声音流的回放进度,应用程序应估计完整声音文件的最终大小,并在其计算
中使用该值。您可以使用 Sound 对象的 bytesLoaded 和 bytesTotal 属性来估计声音数据
的最终长度,如下所示:

var estimatedLength:int = 
 
 Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); 
 
 var playbackPercent:uint = 100 * (channel.position / estimatedLength); 
 
 以下代码加载一个较大的声音文件,并使用 Event.ENTER_FRAME 事件作为其计时机制来显 
 
 示回放进度。它定期报告回放百分比,这是作为当前位置值除以声音数据的总长度来计算的: 
 
 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); 
 
 snd.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); 
 
 }


在开始加载声音数据后,此代码调用 snd.play() 方法,并将生成的 SoundChannel 对象存
储在 channel 变量中。随后,此代码在主应用程序中添加 Event.ENTER_FRAME 事件的事件
侦听器,并在 SoundChannel 对象中添加另一个事件侦听器,用于侦听在回放完成时发生
的 Event.SOUND_COMPLETE 事件。
每次应用程序到达其动画中的新帧时,将调用 onEnterFrame() 方法。onEnterFrame() 方
法基于已加载的数据量来估计声音文件的总长度,然后计算并显示当前回放百分比。
当播放整个声音后,将执行 onPlaybackComplete() 方法来删除 Event.ENTER_FRAME 事件
的事件侦听器,以使其在完成回放后不会尝试显示进度更新。
可以每秒多次调度 Event.ENTER_FRAME 事件。在某些情况下,您不需要频繁显示回放进度。
在这些情况下,应用程序可以使用 flash.util.Timer 类来设置其自己的计时机制