欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          詳解uni-app(vue)基于InnerAudioContext封裝一個基本的音頻組件

          詳解uni-app(vue)基于InnerAudioContext封裝一個基本的音頻組件

          相關(guān)學(xué)習(xí)推薦:微信小程序開發(fā)

          原由

          同樣的是因為小程序官方不維護audio組件了

          音頻組件的要求與限制

          1、點擊播放或者暫停
          2、顯示播放進度及總時長
          3、通過圖標變化顯示當(dāng)前音頻所處狀態(tài)(暫停/播放/加載中)
          4、頁面音頻更新時刷新組件狀態(tài)
          5、全局有且只有一個音頻處于播放狀態(tài)
          6、離開頁面之后要自動停止播放并銷毀音頻實例

          材料/屬性/方法

          讓我們開始吧

          uni-app Vue

          • 同樣的先構(gòu)造DOM結(jié)構(gòu)
          <view class="custom-audio">   <image v-if="audioSrc !== undefined && audioSrc !== null && audioSrc !== ''" @click="playOrStopAudio" :src="audioImg" class="audio-btn" />   <text v-else @click="tips" class="audio-btn">無音源</text>   <text>{{ fmtSecond(currentTime) }}/{{ fmtSecond(duration) }}</text></view>復(fù)制代碼
          • 定義接受的組件
          props: {  audioSrc: {    type: String,    default: ''   }, },復(fù)制代碼
          • 定義CustomAudio組件的初始化相關(guān)的操作,并給innerAudioContext的回調(diào)添加一些行為(之前Taro那篇我們踩過的坑這里就直接上代碼了)
          import { formatSecondToHHmmss, afterAudioPlay, beforeAudioRecordOrPlay } from '../../lib/Utils'const iconPaused = '../../static/images/icon_paused.png'const iconPlaying = '../../static/images/icon_playing.png'const iconStop = '../../static/images/icon_stop.png'const iconLoading = '../../static/images/icon_loading.gif'// ...data() {  return {    audioCtx: null, // 音頻上下文     duration: 0, // 音頻總時長     currentTime: 0, // 音頻當(dāng)前播放的時長     audioImg: iconLoading, // 默認狀態(tài)為加載中   } },watch: {  audioSrc: {     handler(newSrc, oldSrc) {      console.log('watch', newSrc, oldSrc)      this.audioImg = iconLoading      this.currentTime = 0       this.duration = 0       if (this.audioCtx === undefined) {        this.audioCtx = uni.createInnerAudioContext()        this.onTimeUpdate = this.audioCtx.onTimeUpdate        this.bindAuidoCallback(this.audioCtx)       } else {        this.audioCtx.src = newSrc       }      if (this.audioCtx.play) {        this.audioCtx.stop()         getApp().globalData.audioPlaying = false       }     }   } }, mounted() {  this.audioCtx = uni.createInnerAudioContext()  this.audioCtx.src = this.audioSrc  this.audioCtx.startTime = 0   this.bindAuidoCallback(this.audioCtx) },methods: {   bindAuidoCallback(ctx) {     ctx.onTimeUpdate((e) => {      this.onTimeUpdate(e)     })     ctx.onCanplay((e) => {      this.onCanplay(e)     })     ctx.onWaiting((e) => {      this.onWaiting(e)     })     ctx.onPlay((e) => {      this.onPlay(e)     })     ctx.onPause((e) => {      this.onPause(e)     })     ctx.onEnded((e) => {      this.onEnded(e)     })     ctx.onError((e) => {      this.onError(e)     })   },   tips(){     uni.showToast({      title: '無效音源,請先錄音',      icon: 'none'     })   },   playOrStopAudio() {    if (this.audioCtx === null) {      this.audioCtx = uni.createInnerAudioContext()      this.audioCtx.src = this.audioSrc      this.bindAuidoCallback(this.audioCtx)     }    if (this.audioCtx.paused) {      if (beforeAudioRecordOrPlay('play')) {        this.audioCtx.play()        this.audioImg = iconPlaying       }     } else {      this.audioCtx.pause()       afterAudioPlay()      this.audioImg = iconPaused     }   },   onTimeUpdate(e) {    console.log('onTimeUpdate', this.audioCtx.duration, this.audioCtx.currentTime)    if (this.audioCtx.currentTime > 0 && this.audioCtx.currentTime <= 1) {      this.currentTime = 1     } else if (this.currentTime !== Math.floor(this.audioCtx.currentTime)) {      this.currentTime = Math.floor(this.audioCtx.currentTime)     }    const duration = Math.floor(this.audioCtx.duration)    if (this.duration !== duration) {      this.duration = duration     }   },   onCanplay(e) {    if (this.audioImg === iconLoading) {      this.audioImg = iconPaused     }    console.log('onCanplay', e)   },   onWaiting(e) {    if (this.audioImg !== iconLoading) {      this.audioImg = iconLoading     }   },   onPlay(e) {    console.log('onPlay', e, this.audioCtx.duration)    this.audioImg = iconPlaying    if (this.audioCtx.duration > 0 && this.audioCtx.duration <= 1) {      this.duration = 1     } else {      this.duration = Math.floor(this.audioCtx.duration)     }   },   onPause(e) {    console.log('onPause', e)    this.audioImg = iconPaused   },   onEnded(e) {    console.log('onEnded', e)    if (this.audioImg !== iconPaused) {      this.audioImg = iconPaused     }     afterAudioPlay()   },   onError(e) {     uni.showToast({      title: '音頻加載失敗',      icon: 'none'     })    throw new Error(e.errMsg, e.errCode)   },   fmtSecond(sec) {    const { min, second } = formatSecondToHHmmss(sec)    return `${min}:${second}`   } },復(fù)制代碼

          同樣的scss文件

          <style lang="scss" scoped>.custom-audio {  border-radius: 8vw;  border: #CCC 1px solid;  background: #F3F6FC;  color: #333;  display: flex;  flex-flow: row nowrap;  align-items: center;  justify-content: space-between;  padding: 2vw;  font-size: 14px;   .audio-btn {    width: 10vw;    height: 10vw;    white-space: nowrap;    display: flex;    align-items: center;    justify-content: center;   } } </style>復(fù)制代碼

          最后

          詳解uni-app(vue)基于InnerAudioContext封裝一個基本的音頻組件

          各位有遇到什么問題或有什么建議的可以跟我討論喲~

          想了解其他精品文章,敬請訪問uni-app欄目~

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號