音频播放是Flash的一个重要特性,很多产品线采用Flash作为音频播放的跨平台解决方案。但是,Flash内置的MP3播放内核并不十分完善。这里我们将Flash音频播放器项目过程中碰到的一些疑难杂症及对应解决方案做一个汇总,供类似项目借鉴。
1.歌曲长度获得不准确
现象演示:
原因:如果MP3文件与播放器跨域但没有相应的跨域策略访问文件,那么播放器将不能通过读取ID3标签的方式获得歌曲长度。这种情况下,我们只能通过sound.length * sound.bytesTotal / sound.bytesLoaded 来粗略估算歌曲长度,所以在歌曲文件完全加载完成之前,这个估算值是可能不准确且在变动的
解决方案:无
2.调用soundChannel.stop()之后再去获取soundChannel.position,值会是0
原因:未知
解决方案:调用soundChannel.stop()之前先调用soundChannel.position,便可获得正确的position值,原因未知,很诡异。
3.某些浏览器下(比如maxthon),有可能在设置播放进度后,即使新的播放位置并非末尾,soundChannel也会抛出SOUND_COMPLETE事件
现象演示:
原因:如果MP3文件与播放器跨域但没有相应的跨域策略访问文件,那么播放器将不能通过读取ID3标签的方式获得歌曲长度。这种情况下,我们只能通过sound.length * sound.bytesTotal / sound.bytesLoaded 来粗略估算歌曲长度,所以在歌曲文件完全加载完成之前,这个估算值是可能不准确且在变动的
解决方案:在SOUND_COMPLETE事件的侦听器中,增加判断,如果当前播放进度确实是非常接近歌曲长度,才认为是真正的播放完成,否则忽略。
解决效果:
4.部分MP3文件可以加载,但总时长一直显示为0,播放进度也一直为0,没有声音
现象演示:
原因:这些MP3文件请求被重定向,返回的不是音频文件而是一段HTML。
解决方案:检测播放状态改变,在状态从缓冲变成播放时,如果获得的总时长为0,那么认为这是一个坏链,与加载失败一样处理。
解决效果:
5.部分MP3文件在正常播放过程中会卡住
现象演示:(播放会在26秒卡住)
原因:这些MP3文件是受损文件,而Flash 音频播放核心没有完善容错功能。
解决方案:在播放状态下,通过一个Daemon不停的监听播放进度是否正常,如果进度没有变化,则将播放进度前移一定长度(比如1秒),跳过坏点。虽然用户仍能明显听出这个坏点,但至少播放进度不会一直卡在坏点那里。
解决效果:
6.部分MP3文件可以正常加载并显示总时长,但播放进度一直为0,没有声音
现象演示:
原因:这些文件是伪MP3,虽然后缀是mp3,但实际上是其它格式的音频,比如WMA。
解决方案:没有很好的办法能够判断出伪MP3,只能同现象5的处理方案类似,在多次连续检测到播放进度没有改变后,认为这是一个坏链,与加载失败一样处理。
解决效果: