很久就听说AS3的Sound有些诡异,一直没有亲见,这次终于碰上了。 下面是段简单的代码:
var sound:Sound = new Sound(); sound.addEventListener(Event.COMPLETE,onLoaded); var soundChannel:SoundChannel; sound.load( new URLRequest("test.mp3") ); function onLoaded(e:Event):void { soundChannel = sound.play(); soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundOver); }</p> <p>function onSoundOver(e:Event):void { trace("over:"+sound.length+":"+soundChannel.position); }
播放完毕,会发现SOUND_COMPLETE事件触发时,position总会小于length,实际测试时,mp3文件不同的采样率导致不同的误差,大的有好几秒,小的有几百毫秒。在一般情况下,这个误差可以忽略,但如果需要对声音时间进行精确控制,问题就大了。最近做的项目中恰好需要对声音进行精确控制,精确到200毫秒左右,在经过反复检测后发现了这个问题。 Google下,发现很多人都遇到了同类问题,比较权威的解释是:Flash Player可以处理比特率在16-320kbps范围内的mp3,且总以44.1khz的采样率来进行播放,这意味着如果原采样率是22khz,则以两倍速度进行播放,于是产生了误差。 有个老外写了一个精确获取position的方法,通过采样率来校正误差,地址一时找不到了,但还是没能彻底解决这个问题,只有等Adobe来做了。