系统中要求有语音报警功能,在监控页面不断轮询后台报警,有新的语音报警会在页面播放,目前采用bgsound标签,当然该标签仅支持IE浏览器,这个不是关键,关键是该标签只有一个src属性,并没有播放列表,比如这次查询5个声音报警,需要顺序播放,那么我用JS来控制src的值,而且要延迟几秒,但控制的并不好,经常播着播着就乱套了呵呵不知道友友们有没有这方面的经验给指点一二呢!比如弄个隐藏的播放列表啥的,每次来新的声音就追加到后面,播放器不用考虑播放啥音乐,只要一直顺序播放就好了,没有就不播放,知道没有下一首音乐为止,播放过的音乐从列表中删除,不知道有没有,百度了一下午也没找到方案。大家给点意见和建议吧!

解决方案 »

  1.   

    将不同的语音提示做成swf文件。优势:体积小,音质可以控制。
    页面加载时,将这些文件都加载一次,以在客户端进行缓存,类似于预加载图片。用一个数组 var playList=[];记录播放列表
    当有报警时,往数组入一个文件名
    同时,有一个window.setTimeout在数组中去取一个值,当返回值不是空的情况下,调用flash播放器,修改flash播放器的src属性,同时调用.play方法,让flash去播放。
    flash播放器宽和高设为0即可。
      

  2.   

    楼上说的缓存方案不错,不用每次请求下载声音文件。那么数组何时清除呢?一直追加数组会越来越大啊!还有就是播放的时间间隔问题,如果所有声音文件的长度一致还好控制,如果不一致就很难控制了。还有个问题是目前采用AJAX异步读取服务器报警,这样一来,何时返回也是不确定的,现在就是因为这个异步导致播放的脚本打架,覆盖。唉~
      

  3.   

    你说的不是问题。
    js的数组可以很容易的实现队列结构。
    最后得到的报警在队列的未尾。
    始终从除列的头部读取报警声音。。而且这二个操作(ajax,以及setTimeout)是两个不同的操作,不会有任何影响。
    在ajax的回调中加入除列。
    setTimeout从除列的头读取。
      

  4.   

    <div id="SoundDiv">swf声音文件</div>js控制SoundDiv.innerHTML来切换声音文件
      

  5.   

    想起了 JS数组是栈。压栈和出栈 谢谢 truelove12