应用程序可能需要了解何时停止播放某种声音,以便开始播放另一种声音,或者清除在以前播放期间使用的某些资源。SoundChannel 类在其声音完成播放时将调度
Event.SOUND_COMPLETE
事件。应用程序可以侦听此事件并执行相应的动作,如下所示:
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var snd:Sound = new Sound();
var req:URLRequest = new URLRequest("smallSound.mp3");
snd.load(req);
var channel:SoundChannel = snd.play();
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
public function onPlaybackComplete(event:Event)
{
trace("The sound has finished playing.");
}
SoundChannel 类在播放期间不调度 progress 事件。若要报告播放进度,应用程序可以设置其自己的计时机制并跟踪声音播放头的位置。
若要计算已播放的声音百分比,您可以将
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);
channel.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 类来设置其自己的计时机制;请参阅
使用日期和时间
。