vue 音视频波形图展示(peaks.js)

效果展示

 演示地址:https://waveform.prototyping.bbc.co.uk/

api参考地址:https://github.com/bbc/peaks.js

需要安装依赖文件:

npm install --save peaks.js 
npm install --save konva 
npm install --save waveform-data

引入: import Peaks from 'peaks.js';

一.基础使用

容器

    <div id="peak-container">
      <div id="zoomview-container" ref="zoomview"></div>
      <div id="overview-container" ref="overview"></div>
      <audio ref="audio" id="audio" controls="controls">
        <source src="@/mp3/living.mp3" type="audio/mpeg" />
      </audio>
    </div>

js部分

created() {
  this.$nextTick(() => {
    this.init();
  });
},
 
init() {
      const options = {
        zoomview: {
          container: this.$refs.zoomview, //缩略图
        },
        overview: {
          container: this.$refs.overview,
        },
        mediaElement: this.$refs.audio,
        webAudio: {
          audioContext: new AudioContext(),
        },
        emitCueEvents: true,
      };
      Peaks.init(options, (err, peaks) => {
        if (err) return;
      });
    },

注:不要忘记设置容器的高度

#zoomview-container {
  height: 300px;
}
#overview-container {
  height: 300px;
}

二.添加一些基础方法 

在初始化option中,只需要修改mediaElement中的dom就可以展示音频或视频波形图

完整代码

<template>
  <div>
    <!-- <video
      ref="video"
      id="video"
      width="100%"
      height="100%"
      crossOrigin="Anonymous"
      src=""
    /> -->
    <div id="peak-container">
      <div id="zoomview-container" ref="zoomview"></div>
      <div id="overview-container" ref="overview"></div>
    </div>
    <div id="demo-controls">
      <audio ref="audio" id="audio" controls="controls">
        <source src="@/mp3/living.mp3" type="audio/mpeg" />
      </audio>
    </div>

    <div>
      <el-button @click="delel">销毁</el-button>
      <el-button @click="play">播放/暂停</el-button>
      缩略图展示的时间区间
      <el-button @click="big" id="big" ref="big">收起</el-button>
      <el-button @click="small" id="small" ref="small">展开</el-button>
      <el-button id="seek" ref="resetPaly" @click="resetPaly">重置</el-button>
      波幅调节
      <el-slider
        vertical
        height="200px"
        @input="input"
        v-model="scaleValue"
        id="amplitude-scale"
        :format-tooltip="formatTooltip"
        :step="10"
      ></el-slider>
      <el-button @click="zoomable">显示/隐藏可缩放波形图</el-button>
    </div>
  </div>
</template>
  
  <script>
import Peaks from "peaks.js";
const amplitudeScales = {
  0: 0.0,
  1: 0.1,
  2: 0.25,
  3: 0.5,
  4: 0.75,
  5: 1.0,
  6: 1.5,
  7: 2.0,
  8: 2.5,
  9: 3.0,
  10: 3.5,
};
export default {
  data() {
    return {
      playPause: true, //true 播放 false 暂停
      peaks: "",
      //  只能将其隐藏,dom元素需要保留
      dispaly: false,
      scaleValue: 50,
    };
  },
  created() {
    this.$nextTick(() => {
      const options = {
        zoomview: {
          container: this.$refs.zoomview,
        },
        overview: {
          container: this.$refs.overview,
        },
        // 只需要修改dom就可以展示音频或视频波形图
        mediaElement: this.$refs.audio,
        webAudio: {
          audioContext: new AudioContext(),
        },
        emitCueEvents: true,
        //  //显示轴标签
        showAxisLabels: true,
      };
      Peaks.init(options, (err, peaks) => {
        if (err) {
          console.log("messge " + err);
          return;
        }
        this.peaks = peaks;
      });
    });
  },
  methods: {
    delel() {
      this.peaks.destroy();
      //必须将其src清空或audio销毁,不然音频任可以播放
      this.$refs.audio.src = "";
    },
    play() {
      if (this.playPause) {
        this.peaks.player.play();
        this.playPause = false;
      } else {
        this.peaks.player.pause();
        this.playPause = true;
      }
    },
    big() {
      console.log(this.peaks);
      this.peaks.zoom.zoomIn();
      console.log("收起");
    },
    small() {
      this.peaks.zoom.zoomOut();
      console.log("展开");
    },
    resetPaly() {
      this.peaks.player.seek(0.0);
      console.log("重置");
      // }
    },
    input(value) {
      let scale = amplitudeScales[value / 10];
      // 隐藏缩略图时候进行处理
      if (this.peaks.views.getView("zoomview")) {
        this.peaks.views.getView("zoomview").setAmplitudeScale(scale);
      }
      this.peaks.views.getView("overview").setAmplitudeScale(scale);
    },
    formatTooltip(val) {
      return val / 10;
    },
    zoomable() {
      let container = document.getElementById("zoomview-container");
      let zoomview = this.peaks.views.getView("zoomview");

      if (zoomview) {
        this.peaks.views.destroyZoomview();
        container.style.display = "none";
      } else {
        container.style.display = "block";
        this.peaks.views.createZoomview(container);
      }
    },
  },
};
</script>
  
  <style>
#zoomview-container {
  height: 300px;
}
#overview-container {
  height: 300px;
}
</style>
  

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值