应用程序可能需要了解何时停止播放某种声音,以便开始播放另一种声音,或者清除在以前
回放期间使用的某些资源。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 类来设置其自己的计时机制