首页 > 其他分享 >vue2播放音频组件mp3

vue2播放音频组件mp3

时间:2024-03-14 09:48:06浏览次数:21  
标签:return url 音频 height audioObj vue2 musicAny audio mp3

贴代码直接使用,配合了el-slider组件完成

  父组件

data(){
  return{
        queryParams{
                visitTapesList:[{url:'xxxxxx'},{url:'xxxxxx'},{url:'xxxxxx'}]
            }
    }      
}
<Audio
              v-for="(item,index) in queryParams.visitTapesList"
              :key="index"
              :audioObj="item"
              style="display: inline-block;margin-right:20px"
            ></Audio>

 

  子组件

<template>
  <div>
    <audio
      controls
      ref="audio"
      class="audio"
      @timeupdate="updateTime"
      @durationchange="shichang"
      hidden="true"
    >
      <source :src="ausc" />
    </audio>
    <div class="audio-box">
      <div class="subassembly">
        <div
          class="control"
          @click="palyAuto"
          :style="{backgroundImage: 'url(' + (coverImgUrl ?    paused:play) + ')', backgroundSize:'100% 100%', backgroundRepeat: 'no-repeat'}"
        ></div>
        <div class="content">
          <div class="aduion-name">{{ auname }}</div>
          <div class="aduion-tiem">
            <el-slider
              class="aduion-slider"
              v-model="prsValue"
              :show-tooltip="false"
              @change="changeLong"
              @mousedown.native="progressState = true"
              @mouseup.native="progressState = false"
            ></el-slider>
            {{ totaltime }}
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  components: {},
  props: {
    audioObj: {
      type: Object
    }
  },
  data() {
    return {
      paused: require("@/assets/audio/paused.png"),
      play: require("@/assets/audio/play.png"),
      coverImgUrl: false, //暂停还是播放
      prsValue: 0, //播放进度
      // slider是否处于拖动状态 解决鼠标拖拽slider滑块滑动到指定位置无效
      progressState: false,
      totaltime: 0,
      musicAny: {},
      ausc: "",
      auname: ""
    };
  },
  watch: {
    isAudio(newV, oldV) {
      console.log(newV, oldV, "新旧值");
    }
  },
  computed: {
    isAudio() {
      this.ausc = this.audioObj.url;
      this.auname = this.audioObj.url.substring(
        this.audioObj.url.lastIndexOf("/") + 1
      );
      console.log(this.audioObj, this.ausc, "音频");
      return this.audioObj;
    }
  },
  methods: {
    // 原生当前播放进度
    updateTime(e) {
      //解决拖放回滚问题
      if (!this.progressState) {
        //获取进度进行计算
        this.currenttime = this.s_to_hs(parseInt(e.target.currentTime));
        this.suanshu();
      }
    },
    // 计算音乐进度
    suanshu() {
      let length = (this.musicAny.currentTime / this.musicAny.duration) * 100;
      this.prsValue = length;
      if (this.prsValue == 100) {
        this.coverImgUrl = false;
      }
    },
    //原生获取时长
    shichang(e) {
      this.totaltime = this.s_to_hs(parseInt(e.target.duration));
    },
    // 自定义组件播放暂停
    palyAuto() {
      this.coverImgUrl = !this.coverImgUrl;
      if (this.coverImgUrl) {
        this.$refs.audio.play();
      } else {
        this.$refs.audio.pause();
      }
    },
    // 自定义组拖拽音乐进度
    changeLong(e) {
      console.log(e, "+++++++++++");
      this.$refs.audio.currentTime = Math.round(
        (e / 100) * this.musicAny.duration
      );
      console.log(this.$refs.audio.currentTime, "进度——————————————————————");
    },
    //解决拖放回滚问题
    changeProgressState(e) {
      this.progressState = false;
    },
    // 秒数转换分+秒
    s_to_hs(s) {
      var h;
      h = Math.floor(s / 60);
      s = s % 60;
      h += "";
      s += "";
      h = h.length == 1 ? "0" + h : h;
      s = s.length == 1 ? "0" + s : s;
      if (isNaN(h)) {
        return "&infin;";
      }
      return h + ":" + s;
    }
  },
  created() {},
  mounted() {
    this.musicAny = this.$refs.audio;
  }
};
</script>
<style lang="scss" scoped>
.audio-box {
  width: 351px;
  height: 62px;
  border: 1px solid #d9d9d9;
  border-radius: 4px;
  position: relative;
  .audio {
    position: absolute;
    z-index: 0;
  }
  .subassembly {
    position: absolute;
    z-index: 10;
    display: flex;
    height: 100%;
    align-items: center;
    width: 100%;
    .control {
      width: 40px;
      height: 40px;
      cursor: pointer;
      margin: auto 20px;
    }
    .content {
      flex: 1;
      height: 100%;
      margin-right: 20px;
      line-height: normal;
      padding: 11.5px 0;
      overflow: hidden;
      white-space: nowrap;
      text-overflow: ellipsis;
      .aduion-name {
        display: inline;
      }
      .aduion-tiem {
        display: flex;
        align-items: center;
        margin-top: 10px;
        .aduion-slider {
          // height: 3px !important;
          width: 90%;
          margin-right: 4.33px;
        }
      }
    }
  }
}

::v-deep .el-slider__bar {
  background-color: #666666;
}
</style>

 

标签:return,url,音频,height,audioObj,vue2,musicAny,audio,mp3
From: https://www.cnblogs.com/whenwei123/p/18072119

相关文章

  • Vue2.x笔记:组件通信
    一、插槽slot插槽(slot)是一种Vue中组件通信的方式,主要用于父组件向子组件传递自定义内容。有三种插槽:默认插槽:最基本的插槽,没有任何标识,每个子组件只能定义一个具名插槽:具有name属性的默认插槽,每个子组件可以定义多个作用域插槽:子组件提供数据,由父组件决定其渲染方式1.默......
  • 基于Vue(提供Vue2/Vue3版本)和.Net Core前后端分离、跨平台的快速开发框架
    前言今天大姚给大家推荐一款基于Vue(提供Vue2/Vue3版本)和.NetCore前后端分离、开源免费(MITLicense)、强大、跨平台的快速开发框架,并且框架内置代码生成器(解决重复性工作,提高开发效率),支持移动端(iOS/Android/H5/微信小程序):Vue.NetCore。提高开发生产效率、避免996可以考虑试试这......
  • python 使用PaddleOCR读取图片文字,并用pyttsx3转为音频
    python小白,纯纯小白,很久之前看了一遍菜鸟官网,但实在没有应用场景,所以过目即忘。最近工作不是很忙,给我出了个题目,觉得挺有意思,就玩一玩。  所以关键点就是,图片提取出文字,然后文字转音频。1.图片提取文字,PaddleOCR出题人士,给出了git上一个ocr的工具库,支持图文信息的抽取。用......
  • Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/
    一、前言用ffmpeg做音视频保存到mp4文件,都会遇到一个问题,尤其是在视频监控行业,就是监控摄像头设置的音频是PCM/G711A/G711U,解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw,将这个原始的音频流保存到mp4文件是会报错的,在调用avformat_write_header写文件头的时候提示(-22)Invali......
  • vue前端获取/切换麦克风、播放采集音频和采集音量大小完整代码
    1、创建Vue项目在终端运行npminstallelement-uinpminstallrecordrtc2、案例图示 3、代码1、获取麦克风列表if(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){varMic=[]//弹框获取麦克风navigator.mediaDevices.getUserMedia({a......
  • vue2接入paypal支付
     paypal支付,官网实例引入cdn在加载该组件时就读取脚本data(){return{clientId:'AbJmdo6IqMHBMfgJVP-qWfFacVBBDOE45hOJGp8_XpZ1uq4ytOzOPDX4jw2p0pUTPmNptRA40BEqgdXf',//paypal客户端id};},mounted(){this.initScript()},methods:{......
  • 瑞芯微 | I2S-音频基础 -1
    最近调试音频驱动,顺便整理学习了一下i2s、alsa相关知识,整理成了几篇文章,后续会陆续更新。喜欢嵌入式、Li怒晓得老铁可以关注一口君账号。1.音频常用术语名称含义ADC(AnalogtoDigitConversion)模拟信号转换为数字信号AEC(AcousticEchoCancellor)回声消除AGC(A......
  • FFMPEG视音频编解码零基础学习方法
    背景知识FFmpeg是一个强大的开源软件项目,包含一套大量的库和程序,用于处理多媒体数据。它可以编码、解码、流式传输、过滤和播放几乎任何人类和及其创建的音频和视频。使用FFMPEG作为内核视频播放器Mplayer、ffplay射手播放器暴风影音KMPlayerQQ影音使用FFMPEG作为......
  • vue2项目中不能直接在store中声明响应式变量,vue3项目中能在store中直接声明响应式变量
    vue2项目中不能直接在store中声明响应式变量,vue3项目中能在store中直接声明响应式变量,页面元素也会响应式生效在Vue2项目中,store中的状态默认情况下是不具备响应式的特性的。这是因为Vue2.x使用的是基于对象定义的Vue.observable()来创建响应式对象,而store中的状态是通......
  • Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助开始之前CompositionAPI 可以说是Vue3的最大特点,那么为什么要推出CompositionApi,解决了什么问题?通常使用Vue2开发的项目,普遍会存在以下问题:代码的可读性随着组件变大而变差每一种代码复用的方式,都存在缺点T......