源码在最后,喜欢就给个Star ! javascript
萌新跪求优化指导,请Forks前端
话说在那么紧张的大三快要找实习了而本身还在玩这些真的好吗?T_Tjava
这个小工具是我在最近解决项目问题中制做的。git
背景是这样的:做为前端的萌新,被主程老大们吓得瑟瑟发抖。语音实时通信!这个是最近项目中的一个里程碑,也是一个难点所在。主程老大们的想法是,浏览器录音,切片,经过服务器转存再经过广播Url的方式进行转发。使得各个客户端均可以实时通信。github
解决方法:大神 muaz-khan WebRTC中的 MediaStreamRecorder 进行浏览器录音和切片(膜拜),使用七牛云 存储,转发并得到切片语音的Url!最后最后,就是拼接语音啦,因此就产生了这个cc-audiobuffer工具。shell
cc-audiobuffer采用了ES6封装类来实现,而且使用babel转义。npm
递归的思想,只要缓冲区中还有Audio,就继续播放。数组
事件监听,监听Audio对象中的 ended
事件做为下一段语音播放的标志。浏览器
play() { const _this = this if (this.isHasBuffer()) { this.currentAudio = this.shiftBuffer() this.currentAudio.play() _this.currentAudio.addEventListener('ended', function () { _this.play() }, false) }else{ this.currentAudio=null } }
在语音的Url加入缓冲区的时候,使用Audio对象的preload属性实现。服务器
let audio = new Audio(url) audio.preload = "auto" this.AudioUrlBag.push(audio)
CCAudioBuffer有pushBuffer('url')
方法,若是缓冲区有Audio正在播放的话,此方法将新的Audio加入队列,若是缓冲区中没有Audio播放,将会将Audio加入缓冲区同时自动播放新的Audio。
pushBuffer(url) { if(!this.isHasCurrentAudio()){ let audio = new Audio(url) audio.preload = "auto" this.AudioUrlBag.push(audio) this.play() } else{ let audio = new Audio(url) audio.preload = "auto" this.AudioUrlBag.push(audio) } }
npm:
npm install cc-audiobuffer
import CCAudioBuffer from 'cc-audiobuffer'
script:
<script src="dist/cc-audiobuffer.js"></script>
无参数建立
let CCAudioBuffer = new CCAudioBuffer() CCAudioBuffer.pushBuffer('url')
当有新的url语音地址传过来的时候,CCAudioBuffer会提早加载而且自动播放语音。无论什么时候调用pushBuffer('url')
,这些语音都会依次进入缓冲区且连续播放直到缓冲区为空。
有参数建立
let CCAudioBuffer= new CCAudioBuffer([new Audio('url'),new Audio('url'),new Audio('url')]) CCAudioBuffer.play() CCAudioBuffer.pushBuffer('url')
当你有参数建立时,参数规定是Audio对象的一个数组。
接下来须要调用play()
接口保证参数内的Audio播放。
pushBuffer()
的做用和无参数建立同样。
最近真是忙成象拔蚌,这个工具作的很急,自我安慰下。
源码很短很短,也没有考虑到对象内部的一些私有封装什么的。仍是想之后有时间能重写一下。
也写写些请求啥的,但愿请教你们,问问你们有没有优化方案什么的,也给小生我上门课。
最后这里是Gayhub源码
喜欢给个Star!指教给个Forks!