Home Web Front-end uni-app Detailed explanation of uni-app (vue) encapsulating a basic audio component based on InnerAudioContext

Detailed explanation of uni-app (vue) encapsulating a basic audio component based on InnerAudioContext

Sep 19, 2020 pm 04:32 PM
uni-app Audio components

Detailed explanation of uni-app (vue) encapsulating a basic audio component based on InnerAudioContext

Related learning recommendations: WeChat Mini Program Development

## The reason

is also because the official mini program does not maintain the

audio component

Requirements and restrictions of audio components

1. Click to play or pause

2. Display the playback progress and total duration
3. Display the current audio status (paused/playing/loading) through icon changes
4. Refresh the component status when the page audio is updated
5. Global There is and only one audio in the playing state
6. Automatically stop playing and destroy the audio instance after leaving the page

Materials/Properties/Methods

Let’s get started

uni-app Vue

    Similarly construct
  • DOMstructure
  • <view class="custom-audio">
      <image v-if="audioSrc !== undefined && audioSrc !== null && audioSrc !== &#39;&#39;" @click="playOrStopAudio" :src="audioImg" class="audio-btn" />
      <text v-else @click="tips" class="audio-btn">无音源</text>
      <text>{{ fmtSecond(currentTime) }}/{{ fmtSecond(duration) }}</text></view>复制代码
    Copy after login
    Define accepted components
  • props: {  audioSrc: {    type: String,    default: &#39;&#39;
      },
    },复制代码
    Copy after login
    Define the operations related to the initialization of the
  • CustomAudio component, and add some behaviors to the callback of innerAudioContext (the pitfalls we stepped on in the previous Taro article will be directly coded here) )
  • import { formatSecondToHHmmss, afterAudioPlay, beforeAudioRecordOrPlay } from &#39;../../lib/Utils&#39;const iconPaused = &#39;../../static/images/icon_paused.png&#39;const iconPlaying = &#39;../../static/images/icon_playing.png&#39;const iconStop = &#39;../../static/images/icon_stop.png&#39;const iconLoading = &#39;../../static/images/icon_loading.gif&#39;// ...data() {  return {    audioCtx: null, // 音频上下文
        duration: 0, // 音频总时长
        currentTime: 0, // 音频当前播放的时长
        audioImg: iconLoading, // 默认状态为加载中
      }
    },watch: {  audioSrc: {
        handler(newSrc, oldSrc) {      console.log(&#39;watch&#39;, 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: &#39;无效音源,请先录音&#39;,      icon: &#39;none&#39;
        })
      },
      playOrStopAudio() {    if (this.audioCtx === null) {      this.audioCtx = uni.createInnerAudioContext()      this.audioCtx.src = this.audioSrc      this.bindAuidoCallback(this.audioCtx)
        }    if (this.audioCtx.paused) {      if (beforeAudioRecordOrPlay(&#39;play&#39;)) {        this.audioCtx.play()        this.audioImg = iconPlaying
          }
        } else {      this.audioCtx.pause()
          afterAudioPlay()      this.audioImg = iconPaused
        }
      },
      onTimeUpdate(e) {    console.log(&#39;onTimeUpdate&#39;, 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(&#39;onCanplay&#39;, e)
      },
      onWaiting(e) {    if (this.audioImg !== iconLoading) {      this.audioImg = iconLoading
        }
      },
      onPlay(e) {    console.log(&#39;onPlay&#39;, 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(&#39;onPause&#39;, e)    this.audioImg = iconPaused
      },
      onEnded(e) {    console.log(&#39;onEnded&#39;, e)    if (this.audioImg !== iconPaused) {      this.audioImg = iconPaused
        }
        afterAudioPlay()
      },
      onError(e) {
        uni.showToast({      title: &#39;音频加载失败&#39;,      icon: &#39;none&#39;
        })    throw new Error(e.errMsg, e.errCode)
      },
      fmtSecond(sec) {    const { min, second } = formatSecondToHHmmss(sec)    return `${min}:${second}`
      }
    },复制代码
    Copy after login
Same

scssfile
<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>复制代码
Copy after login
Finally

Detailed explanation of uni-app (vue) encapsulating a basic audio component based on InnerAudioContext
If you encounter any problems or have any suggestions, you can discuss them with me~

If you want to know other excellent articles, please visit the

uni-app column~

The above is the detailed content of Detailed explanation of uni-app (vue) encapsulating a basic audio component based on InnerAudioContext. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
1 months ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to develop uni-app in VSCode? (Tutorial sharing) How to develop uni-app in VSCode? (Tutorial sharing) May 13, 2022 pm 08:11 PM

How to develop uni-app in VSCode? The following article will share with you a tutorial on developing uni-app in VSCode. This may be the best and most detailed tutorial. Come and take a look!

Use uniapp to develop a simple map navigation Use uniapp to develop a simple map navigation Jun 09, 2022 pm 07:46 PM

How to use uniapp to develop a simple map navigation? This article will provide you with an idea for making a simple map. I hope it will be helpful to you!

Let's talk about how to use uniapp to develop a snake game! Let's talk about how to use uniapp to develop a snake game! May 20, 2022 pm 07:56 PM

How to use uniapp to develop a snake game? The following article will take you step by step to implement the Snake game in uniapp. I hope it will be helpful to you!

How to encapsulate uni-app vue3 interface request How to encapsulate uni-app vue3 interface request May 11, 2023 pm 07:28 PM

uni-app interface, global method encapsulation 1. Create an api file in the root directory, create api.js, baseUrl.js and http.js files in the api folder 2.baseUrl.js file code exportdefault"https://XXXX .test03.qcw800.com/api/"3.http.js file code exportfunctionhttps(opts,data){lethttpDefaultOpts={url:opts.url,data:data,method:opts.method

Examples to explain how uniapp implements the all-select function of multi-select boxes Examples to explain how uniapp implements the all-select function of multi-select boxes Jun 22, 2022 am 11:57 AM

This article brings you relevant knowledge about uniapp, which mainly organizes the related issues of implementing the select-all function of the multi-select box. The reason why the select-all function cannot be implemented is that when the checked field of the checkbox is dynamically modified, the status on the interface can Real-time changes, but the change event of checkbox-group cannot be triggered. Let's take a look at it. I hope it will be helpful to everyone.

Take you step by step to develop a uni-app calendar plug-in (and publish it) Take you step by step to develop a uni-app calendar plug-in (and publish it) Jun 30, 2022 pm 08:13 PM

This article will guide you step by step in developing a uni-app calendar plug-in, and introduce how the next calendar plug-in is developed from development to release. I hope it will be helpful to you!

Let's talk about uniapp's scroll-view drop-down loading Let's talk about uniapp's scroll-view drop-down loading Jul 14, 2022 pm 09:07 PM

How does uniapp implement scroll-view drop-down loading? The following article talks about the drop-down loading of the uniapp WeChat applet scroll-view. I hope it will be helpful to everyone!

Detailed example of how uniapp implements phone recording function (with code) Detailed example of how uniapp implements phone recording function (with code) Jan 05, 2023 pm 04:41 PM

This article brings you relevant knowledge about uniapp. It mainly introduces how to use uniapp to make calls and synchronize recording. Friends who are interested should take a look at it. I hope it will be helpful to everyone.

See all articles