audio样式改造

313 阅读2分钟

audio样式改造

将整数转换成 时:分:秒的格式

function realFormatSecond(second) {
  var secondType = typeof second
​
  if (secondType === 'number' || secondType === 'string') {
    second = Math.floor(second)
​
    var hours = Math.floor(second / 3600)
    second = second - hours * 3600
    var mimute = Math.floor(second / 60)
    second = second - mimute * 60
​
    return hours + ':' + ('0' + mimute).slice(-2) + ':' + ('0' + second).slice(-2)
  } else {
    return '0:00:00'
  }
}

audio原生事件和方法

canplaythrough  事件    // 录音准备就绪后触发
ended  事件             // 录音播放结束后触发
loadedmetadata  事件    // 当加载语音流元数据完成后,会触发该事件的回调函数  可以用于获取语音总时长(e.target.duration)
onTimeupdate  事件      // timeupdate事件大概每秒一次,用来更新音频流的当前播放时间  获取当前时间(e.target.currentTime)
play()  方法            // 开始播放音频
pause()  方法           // 暂停播放
muted  属性(布尔值 )    // 是否静音
currentTime  属性       // 当前播放时间
volume   属性           // 当前播放音量

进度条由 element 的 slider滑块组件修改

max 属性                // 进度条总长度
format-tooltip 属性     // 函数类型,可实时返回进度条的value值,用于拖拽进度条时实时获取拖动的值
change 事件             // 值改变时触发(使用鼠标拖曳时,只在松开鼠标后触发)  可以用于进度条拖拽或点击后修改音频播放的时间

改造过程:

1.通过 loadedmetadata 事件获取音频总时长,双向绑定展示总时长,给进度条总长度max属性赋值
2.通过 onTimeupdate 事件实时获取当前音频,双向绑定动态修改当前展示的播放时间以及进度条当前值
3.点击或拖拽进度条触发 change 事件,修改进度条当前值,以及audio当前播放时间 (this.$refs.audio.currentTime)
4.音量控制修改同进度条,但是不需要自动改变

遇到问题: 拖拽进度条时会发现一个小bug

当拖动进度停住鼠标延迟大概一秒左右松开,进度会回到原来的位置,而快速拖动和点击进度条则不会出现这个问题
拖动滚动条延迟一小会松开,自动播放绑定的值又会变化一次,导致最后一次变化的值覆盖了原来的值,使用官方的input方法也是一样。
​
解决方法1:
监听进度条 mouseup 鼠标抬起事件,获取鼠标抬起时的value值,再手动触发进度条的 change 事件来改变当前播放的时间
但是测试后发现频率过大时还是会偶尔出现进度条回弹的bug
解决方法2:
按下鼠标拖动时,将音频停止播放,鼠标抬起时从最新的时间开始播放