流畅播放你的音乐
在写音乐播放器的时候,我们一般都会设置一个缓冲时间,当缓冲区满了的时候,音乐开始播放。但是,由于网络速度不够快,常常会在播放途中出现缓冲,导致音乐中断,这个一个非常差的音乐体验。因为她不完整了,如何使用户听到完整的音乐?一个最简单的办法就是把所有数据下载下来过后再播放,但是随之而来的是用户可能会等得发狂,尤其是对于那些速度不错的用户。
因此,采用一种新的计算方式,确保加载一定的数据之后我们就开始播放,并确保在播放过程中,缓冲区一直有数据可读.此方法在制作MTV的Flash中,我有说明过,但是音乐存在一个问题:在没有下载完之前,你不知道整个音乐的长度——除非你有其他数据支持.那么我们得采用一种方式来获得:通过计算已下载数据的大小和时间长度,来判断总时间长度,因为大小一般和时间成正比,有点误差,但不大。具体如何实现,请看下面的代码:
首先我们在开始加载时就要得到一个开始的加载时间:
var startLoadTime:uint = getTimer(); player.addEventListener(ProgressEvent.PROGRESS,progressHanlder); player.load(new URLRequest(‘url’));
然后在每次获得新进度时如此判断:
private function progressHanlder(e:ProgressEvent):void{ this.dispatchEvent(e.clone()); if(player.length > 5000){ var useTime:uint = getTimer() – startLoadTime; var music_totle_time:Number = (e.bytesTotal/e.bytesLoaded)*player.length; var expectedTime:Number = (useTime/e.bytesLoaded)*e.bytesTotal; if((expectedTime – useTime) < music_totle_time && (useTime > 3000 || e.bytesTotal == e.bytesLoaded)){ this.play(); player.removeEventListener(ProgressEvent.PROGRESS,progressHanlder); } } }
这个方式的好处是:以最快的速度播放音乐,并确保中间不进行数据缓冲,使音乐流畅的播放。
同时也存在一些问题:
- 如果用户之前有下载过这个音频的一部分,那么计算将不在准确;
- 如果用户的网速不稳定,那么也会导致不准确(可以通过设置更长的初始计算时间来平衡).
