uniapp之音频播放器

这篇具有很好参考价值的文章主要介绍了uniapp之音频播放器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

日常业务会遇到 微信音频 mp3播放器, 特别是微信文章阅读,下面仅作参考

1.解决滑动卡顿bug 加了防抖

2.滑动进度条时 先暂停再播放 就不会出现卡顿

3.初始化时 要onCanplay钩子中 setInterval 获取音频文件长度 不然会显示 0

注意用了vantUI 框架的icon 不用可以去掉 换图片或者其他自定义icon。

*如何使用

// ----------- src/components/wx-video.vue ---------------------------
props: {
    node : {
        attr: { src: '' } // 通过 props 传入音频url
    }    

}
// -------------- usage ---------------------------------
 import WxVideo from '@/components/wx-video';
 <wx-video :node="{  attr: { src: 'http://音频url' } }"/>

上图

uniapp之音频播放器文章来源地址https://www.toymoban.com/news/detail-509445.html

<template>

  <view class="audio-component">

    <view class="audio-slider">

      <view class="img-box" @click="playAudio">

        <van-icon v-show="!state" name="play-circle" size="80rpx" color="#fed723" />

        <van-icon v-show="state" name="pause-circle" size="80rpx" color="#fed723" />

      </view>

      <slider

        block-size="14"

        :value="sliderProgressValue"

        @change="sliderChange"

        min="0"

        :max="sliderMax"

        activeColor="#12C489"

        block-color="#12C489"

        step="1"

      />

      <view class="time-Show">{{ currentTimeStr }}/{{ sliderValue }}</view>

    </view>

  </view>

</template>

<script>

export default {

  name: "wxParseAudio",

  props: {

    node: {

      type: Object,

      default: () => {},

    },

  },

  data() {

    return {

      sliderMax: "", //  例如30     音频总时长

      sliderProgressValue: 0, //  例如11     实时进度

      sliderValue: "00:00", //  例如00:30 最大值

      currentTimeStr: "00:00", //  例如00:11 音频实时播放进度

      innerAudioContext: null, //  实例

      state: false, //  播放状态  false暂停   true播放

    };

  },

  watch: {

    //监听用户点击播放的数据变动

    node: {

      immediate: true, // 加此属性

      handler: function (item) {

        console.log("监听", item);

        this.sliderProgressValue = 0;

        this.currentTimeStr = "00:00";

        // 重置 销毁1

        if (this.innerAudioContext) {

          this.innerAudioContext.destroy();

        }

        if (item) {

          this.innerAudioContext = uni.createInnerAudioContext();

          this.state = false;

          this.innerAudioContext.autoplay = false; //设置是否自动播放

          this.innerAudioContext.obeyMuteSwitch = false; //是否遵循系统静音开关,当此参数为 false 时,即使用户打开了静音开关,也能继续发出声音,默认值 true

          this.innerAudioContext.sessionCategory = "soloAmbient"; //在后台时不播放,如有其他播放,会暂停其他播放(但在移动端h5中 后台不播放失效)

          this.innerAudioContext.src = item.attr.src; //'http://*******/files/download/sound1/206/1638.mp3';//音频的url

          this.innerAudioContext.onCanplay((v) => {

            console.log(v, this.innerAudioContext);

          });

          this.creatAudio();

        }

      },

      deep: true, //深度监听

    },

  },

  methods: {

    throttle(fn, wait) {

      let previous = 0;

      return function (...arg) {

        let context = this;

        let now = Date.now();

        //每隔一段时间执行一次;

        if (now - previous > wait) {

          fn.apply(context, arg);

          previous = now;

        }

      };

    },

    // 点击播放事件

    playAudio() {

      this.state = !this.state;

      // false暂停  true播放

      if (this.state) {

        this.innerAudioContext.play(); //播放

        this.creatAudio(); //获取播放时长进度

      } else {

        this.innerAudioContext.pause(); //暂停

      }

    },

    //实时播放时长

    creatAudio() {

      this.innerAudioContext.onCanplay(() => {

        let intervalID = setInterval(() => {

          if (this.innerAudioContext.duration !== 0) {

            clearInterval(intervalID);

            console.log("音频时长", this.innerAudioContext.duration);

            this.sliderValue = this.formatSecond(this.innerAudioContext.duration);

          }

        }, 500);

      });

      this.innerAudioContext.onSeeked(() => {

        this.innerAudioContext.pause();

        this.innerAudioContext.play();

        this.state = true;

      });

      // 防抖

      const withThrottle = this.throttle(() => {

        const {currentTime, duration} = this.innerAudioContext; //这俩参数是这个api自带的参数, 解构

        console.log(currentTime);

        let currTimeStr = this.formatTime(currentTime);

        // 未转化 时间格式的实时时长

        this.sliderProgressValue = Math.floor(currentTime);

        this.sliderMax = Math.floor(duration);

        // 实时变动的时间

        this.currentTimeStr = currTimeStr;

        //音频总时长

        this.sliderValue = this.formatSecond(duration);

        // console.log('时长',this.sliderProgressValue,this.currentTimeStr,currentTime,duration)

      }, 1000);

      // 播放中的实时监听 播放位置 以及时长

      this.innerAudioContext.onTimeUpdate(withThrottle);

      // 监听播放结束 的处理

      this.innerAudioContext.onEnded(() => {

        console.log("播放结束");

        setTimeout(() => {

          // this.currentTimeStr = this.sliderValue;

          // this.sliderProgressValue = 0;

          this.sliderProgressValue = 0;

          this.currentTimeStr = "00:00";

          this.state = false;

        }, 300);

      });

    },

    //格式化时间格式

    formatTime(num) {

      num = Math.floor(num);

      let second = num % 60;

      if (second < 10) second = "0" + second;

      let min = Math.floor(num / 60);

      if (min < 10) min = "0" + min;

      return min + ":" + second;

    },

    // 拖拽音频播放位置

    sliderChange(e) {

      // console.log('value 发生变化:' + e.detail.value,this.state,this.innerAudioContext)

      const currTimeStr = this.formatTime(e.detail.value);

      this.currentTimeStr = currTimeStr;

      // 播放进度条位置

      this.sliderProgressValue = e.detail.value;

      //设置要播放的位置

      this.innerAudioContext.seek(e.detail.value);

      // this.innerAudioContext.pause()//暂停

      // // 因为拖拽后自动播放 导致实时获取播放时间的方法没有执行【坑点】

      // setTimeout(()=>{

      //  //模拟点击播放

      //  this.state=false

      //  this.playAudio()

      // },1000)

    },

    formatSecond(seconds) {

      var h =

        Math.floor(seconds / 3600) < 10

          ? "0" + Math.floor(seconds / 3600)

          : Math.floor(seconds / 3600);

      var m =

        Math.floor((seconds / 60) % 60) < 10

          ? "0" + Math.floor((seconds / 60) % 60)

          : Math.floor((seconds / 60) % 60);

      var s =

        Math.floor(seconds % 60) < 10

          ? "0" + Math.floor(seconds % 60)

          : Math.floor(seconds % 60);

      // return  h + ":" + m + ":" + s;

      return m + ":" + s;

    },

    // 关闭

    close() {

      if (this.innerAudioContext) {

        this.innerAudioContext.destroy();

      }

      this.sliderMax = ""; //  例如30     音频总时长

      this.sliderProgressValue = 0; //  例如11     实时进度

      this.sliderValue = "00:00"; //  例如00:30 最大值

      this.currentTimeStr = "00:00"; //  例如00:11 音频实时播放进度

      this.innerAudioContext = null; //  实例

      this.state = false;

      this.$emit("AudioDestroy", "关闭");

    },

  },

  // 组件销毁 同时销毁音频

  destroyed() {

    if (this.innerAudioContext) {

      this.innerAudioContext.destroy();

    }

  },

};

</script>

<style lang="less" scoped>

.audio-component {

  background-color: #f5f3f3;

  padding: 20rpx;

  border-radius: 4px;

  // position: fixed;

  // width: calc(100% - 60rpx);

  // left: 0;

  // bottom: 120rpx;

  // margin: 0 30rpx;

}

.audio-slider {

  display: flex;

  align-items: center;

  slider {

    flex: 1;

    margin: 6rpx 40rpx 6rpx 20rpx;

  }

  .img-box {

    width: 80rpx;

    // background-color: red;

    display: flex;

    align-items: center;

    justify-content: center;

    .laba {

      width: 60rpx;

      height: 60rpx;

    }

  }

}

.time-Show {

  color: #9a9b9d;

}

.close-box {

  width: 35rpx;

  height: 35rpx;

  margin-right: 25rpx;

  image {

    width: 35rpx;

    height: 35rpx;

  }

}

.text-content {

  display: flex;

  color: #9a9b9d;

  justify-content: space-between;

  padding: 0 90rpx 0 90rpx;

}

</style>

到了这里,关于uniapp之音频播放器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Audio API 实现音频播放器

    市面上实现音频播放器的库有很多,比如wavesurfer.js、howler.js等等,但是都不支持大音频文件处理,100多M的文件就有可能导致程序崩溃。总之和我目前的需求不太符合,所以打算自己实现一个音频播放器,这样不管什么需求 在技术上都可控。下面我们简单介绍下 wavesurferJs 、

    2024年02月10日
    浏览(46)
  • Python实现本地视频/音频播放器

    在Python中,有几个库可以用于视频播放,但是没有一个库是完美的,因为它们可能依赖于外部软件或有一些限制。 先看介绍用Python实现本地视频播放器,再介绍用Python实现本地音乐播放器。 Python 实现本地视频播放器 与HTML5+JavaScript实现本地视频播放器相比,使用Python实现比

    2024年04月26日
    浏览(38)
  • Vue实现自定义音频播放器组件

    template javascript less 文档参考 关于 Audio 自定义样式 H5 audio 音频标签自定义样式修改以及添加播放控制事件

    2024年02月12日
    浏览(38)
  • 用selenium爬取直播信息,前端音频播放器

    #保存数据的函数 def save_data(self,data_list,i): #在当前目录下将数据存为txt文件 with open(‘./douyu.txt’,‘w’,encoding=‘utf-8’) as fp: for data in data_list: data = str(data) fp.write(data+‘n’) print(“第%d页保存完成!” % i) (2)保存为json文件 #保存数据的函数 def save_data(self,data_list,i): with op

    2024年04月16日
    浏览(50)
  • 一个WPF开发的、界面简洁漂亮的音频播放器

    今天推荐一个界面简洁、美观的、支持国际化开源音频播放器。 这是一个基于C# + WPF开发的,界面外观简洁大方,操作体验良好的音频播放器。 支持各种音频格式,包括:MP4、WMA、OGG、FLAC、M4A、AAC、WAV、APE 和 OPUS;支持标记、实时显示歌词等功能;支持换肤、中英文等主流

    2024年02月01日
    浏览(54)
  • 音频播放器Web页面代码实例(基于HTML5)

    音频播放器Web页面代码实例(基于HTML5):   特别需要注意的点:     如果上传文件时设置的是默认转码方式,所有的文件都会转码为视频文件,使用音频播放器播放视频文件时,只会播放声音,没有图像。     如果上传文件时设置了\\\"源文件播放\\\",平台不会对源文件进行

    2024年02月16日
    浏览(39)
  • 基于 FFmpeg 的跨平台视频播放器简明教程(六):使用 SDL 播放音频和视频

    基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux) 基于 FFmpeg 的跨平台视频播放器简明教程(三):视频解码 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

    2024年02月13日
    浏览(61)
  • html+css+js本地音乐播放器,实现可视化音频频谱

    html+css+js本地音乐播放器,实现可视化音频频谱 之前用swing写了个本地音乐播放器(如下图),但是效果一言难尽,界面丑,功能bug也多,唉 所以后面又重新用html写了个,界面样式和功能方面,比swing写的好看、完善多了。 导入音乐(已完成) 展示列表(已完成) 列表双击

    2024年02月09日
    浏览(54)
  • 腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?

    状态模式是什么? 状态模式,也被称作状态对象模式,是一种行为设计模式。 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。 它让对象在其内部状态改变时改变自己的行为。外部调用者无需了解对象内部状态的具体实现,仅需通过简单的

    2024年01月20日
    浏览(40)
  • vue项目中视频实时播放时播放器遇到的问题和解决过程 flv.js - EasyPlayer - LivePlayer

    需要画面监控设备实时播放,支持HTTP-FLV直播流,支持其他流后续可能会更换 需要类似于安防监控多个视频实时画面同步 播放器可控制度强,完全由我们来控制播放暂停进行拉流断流 项目使用的是的vue3+ts 原本使用的video.js 但是不支持HTTP-FLV播放,改用flv.js 引入flv.js 开发问

    2024年02月01日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包