• 【JS】使用wavesurfer播放网络音频(Vue)


    • 最终效果

    在这里插入图片描述

    此处已经通过npm安装wavesurfer

    • 大致流程:
    1. 通过接口获取网络资源路径
    2. 传入该组件(也可以直接当前组件用)
    3. 初始化wavesurfer音频组件
    4. 通过fetch下载音频资源,Blob
    5. 下载完成后,通过URL.createObjectURL(blob)转为路径
    6. 通过wavesurfer.load(objectURL),初始化音频
    <template>
      <div class="page">
        <div class="top">
          <div>
            <i class="el-icon-view text1" style="color: #736d6d" />
            <span class="text2">浏览量: span>
            <span class="text3">{{ formdata.views }}span>
          div>
        div>
        <div class="main">
          <div class="main-box">
            
            <div class="waveform" ref="wavesurfer">div>
          div>
          <div class="main-button">
            <el-button @click="start()">播放el-button>
            <el-button @click="end()">暂停el-button>
          div>
        div>
        <video v-show="false" ref="Video" class="self_video" />
      div>
    template>
    
    <script>
    import WaveSurfer from 'wavesurfer.js'
    
    export default {
      props: {
        // 音频路径通过父级组件传递至此(父级组件是通过接口获取的路径)
        formdata: {
          type: Object,
          default: () => {}
        }
      },
      data() {
        return {
          wavesurfer: null
        }
      },
      mounted() {
        this.init()
      },
      methods: {
        // 初始化
        init() {
          const wavesurfer = WaveSurfer.create({
            // 元素及样式
            container: this.$refs.wavesurfer,
            height: 340,
            progressColor: '#e03639',
            waveColor: '#e7e7e7',
            cursorColor: '#FFDDDD',
            // 波峰宽度
            barWidth: 8,
            // 是否启用媒体自带的audio控件
            mediaControls: false,
            // 跨域配置
            backend: 'MediaElement',
            xhr: {
              mode: 'no-cors'
            }
          })
          // 拼接当前项目的路径
          const url = process.env.VUE_APP_HOME + this.formdata.fileUri
          fetch(url, {
            method: 'get',
            responseType: 'blob'
          })
            .then(res => {
              return res.blob()
            })
            .then(blob => {
              // 将文件保存下来,并获取路径
              const objectURL = URL.createObjectURL(blob)
              // 通过保存的路径进行访问
              wavesurfer.load(objectURL)
            })
          this.wavesurfer = wavesurfer
        },
        // 播放
        start() {
          this.wavesurfer.play()
        },
        // 暂停
        end() {
          this.wavesurfer.pause()
        }
      }
    }
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 注意事项:
    1. 后端需要配置跨域!后端需要配置跨域!后端需要配置跨域!
    2. 我通过在F12的控制台,用fetch直接打开资源路径,是没有问题的

    在这里插入图片描述

  • 相关阅读:
    pytorch的mask-rcnn的模型参数解释
    .NET周报 【5月第3期 2023-05-21】
    JavaEE——No.1 线程安全问题
    pyflink 设置流批模式
    OKhttp上传图片视频
    Linux权限
    Vue:(五)事件初探
    聊一聊 Spring 6 面向切面AOP
    【毕业季】研究生学长分享怎样让本科更有意义
    词云的可视化设计教程
  • 原文地址:https://blog.csdn.net/yys190418/article/details/126050851