首页 > 其他分享 >项目推荐——音频标注wavesurfer.js用法及相关问题解决

项目推荐——音频标注wavesurfer.js用法及相关问题解决

时间:2024-08-14 09:26:29浏览次数:9  
标签:return 音频 js import wavesurfer const region

一、前言

上期推荐了文本标注poplar-annotation用法,这期针对音视频标注推荐wavesurfer.js库;
Wavesurfer.js 是一个基于Web Audio API 和HTML5 Canvas的开源音频可视化库,用于创建可交互、可定制的波形。同时拥有众多插件库。

二、demo效果

可以实现音视频播放暂停、指定区域播放循环暂停、创建标注区域、标注区域文字编辑、标注区域拖拉拽、时间交互效果等;
可以实现音视频播放暂停、指定区域播放循环暂停、创建标注区域、标注区域文字编辑、标注区域拖拉拽、时间交互效果等;

三、官网

Wavesurfer.js 官网示例

四、使用

1.下载

  • npm install wavesurfer.js

  • 或者引入(不推荐)外部地址不安全

<script src="https://unpkg.com/wavesurfer.js"></script>

2.WaveSurfer 挂载、创建、销毁

useWavesurfer的Hook封装

import React, { useState, useEffect } from "react";
import WaveSurfer from "wavesurfer.js";

const useWavesurfer = (containerRef, options) => {

    const [wavesurfer, setWavesurfer] = useState(null)
    
    useEffect(() => {
      if (!containerRef.current) return
      const ws = WaveSurfer.create({
        ...options,//WaveSurfer的配置项
        container: containerRef.current,//WaveSurfer需要挂载的容器也是dom节点
      })
      setWavesurfer(ws)
      
      //销毁
      return () => {
        ws.destroy()
      }
      
    }, [options, containerRef])
    
    return wavesurfer
  }
  export default useWavesurfer

3.WaveSurferPlayer组件

import React, { useState, useRef, useEffect, useCallback } from "react";
import useWavesurfer from './useWavesurfer.js'

const WaveSurferPlayer = ({plugins}) => {
    const regions=plugins[0]
    const containerRef = useRef()
    const [isPlaying, setIsPlaying] = useState(false)
    const [currentTime, setCurrentTime] = useState(0)
    const wavesurfer = useWavesurfer(containerRef, props)
    const onPlayClick = useCallback(() => {
      wavesurfer.isPlaying() ? wavesurfer.pause() : wavesurfer.play()
    }, [wavesurfer])
    
    useEffect(() => {
      if (!wavesurfer) return
      setCurrentTime(0)
      setIsPlaying(false)
      const subscriptions = [
        wavesurfer.on('play', () => setIsPlaying(true)),
        wavesurfer.on('pause', () => setIsPlaying(false)),
        wavesurfer.on('timeupdate', (currentTime) => setCurrentTime(currentTime)),
        wavesurfer.on('ready',()=>{
          regions.enableDragSelection({
            color: 'rgba(255, 0, 0, 0.1)',
            resize:false,
            drag:false,
          })
          regions.on('region-created', (region) => {
            console.log('region-created', region)
          })
          regions.on('region-clicked', (region, e) => {
            e.stopPropagation() 
            if(!region)return
            region.remove()
            console.log('region-remove', region)
          })
        }),
        wavesurfer.on('finish', () => {
          wavesurfer.setTime(0)
        })
      ]
      return () => {
        //在 useEffect 的清理阶段(即返回的函数),遍历 subscriptions 数组,其中包含了所有的事件监听器。对每一个监听器调用 unsub(),移除事件监听器,确保内存得到释放。
        subscriptions.forEach((unsub) => unsub())
      }

    }, [wavesurfer])
    return (
      <>
        <div ref={containerRef} style={{ minHeight: '120px' }} />
        <button onClick={onPlayClick} style={{ marginTop: '50px',marginLeft:'600px' }}>
          {isPlaying ? 'Pause' : 'Play'}
        </button>
        <p>Seconds played: {currentTime}</p>
      </>
    )
  }
  export default WaveSurferPlayer

每个区域的创建,对应着一个’region-created’,包含id,起始时间,结束时间等;
在这里插入图片描述

4.使用组件

import WaveSurferPlayer from './WaveSurferPlayer.js'
import React, { useState } from "react";
/**regions区域交互插件 */
import RegionsPlugin from 'wavesurfer.js/dist/plugins/regions.esm.js'
/**Timeline时间轴插件 */
import Timeline from 'wavesurfer.js/dist/plugins/timeline.esm.js'
/**Hover时间交互插件 */
import Hover from 'wavesurfer.js/dist/plugins/hover.esm.js'
function App() {
  const [audioUrl, setAudioUrl] = useState(require('./music01.mp3'))//require绝对路径
  return <WaveSurferPlayer
    height={200}
    waveColor='#A8DBA8'
    progressColor='#3B8686'
    url={audioUrl}
    backend="MediaElement"
    plugins={
        [RegionsPlugin.create(), 
        Timeline.create({}),
        Hover.create({
          lineColor: '#000',
          lineWidth: 2,
          labelBackground: '#555',
          labelColor: '#fff',
          labelSize: '11px',
        }),
      ]}
  />
}
export default App

五、相关问题及解决

1.WaveSurfer.create()重复创建、重复挂载的问题

记得要使用WaveSurfer的destroy属性销毁

     //销毁
      return () => {
        ws.destroy()
      }
      

2.资源路径url地址引入的问题

记得引入绝对路径

require('./music01.mp3')

3.插件引入的地址

一定要看官网的地址,很多博主引入的地址都是老版本的

标签:return,音频,js,import,wavesurfer,const,region
From: https://blog.csdn.net/weixin_56048772/article/details/141181452

相关文章

  • 关于js前端全屏事件
    有一个pad端需求,要求进到项目之后在浏览器中将整个项目全屏,window.onload=()=>{letelement=document.documentElementif(element.requestFullscreen){element.requestFullscreen()}elseif(element.msRequestFul......
  • excel.js 实现前端html 表格导出
    文档中文文档https://github.com/exceljs/exceljs/blob/master/README_zh.mdgit地址https://github.com/exceljs/exceljs/tree/master表格属性批量设置表格列宽度worksheet.columns=[{header:'Id',key:'id',width:10},{header:'Name'......
  • @DateTimeFormat 和 @JsonFormat 注解详解
    目录一、快速入门1.1准备工作1.2、入参格式化(前端传参到后端)1.3、出参格式化(后端返回给前端)1.4、如果是请求体@RequestBody传参二、详细解释这两个注解1、@JsonFormat2、@DateTimeFormat注意:1、这两者的注解一般联合使用2、注意2参考链接一、快速入门先说总结:如果......
  • node.js文件上传(图片等等...)——利用connect-multiparty中间件
    一.概念步骤讲解1.安装和引入中间件安装:通过npm安装connect-multiparty:npminstallconnect-multiparty--save。引入:在项目中引入connect-multiparty:varmultipart=require('connect-multiparty');2.基本设置配置上传目录:指定上传文件的临时存储位置,例如:app.us......
  • 25.python模块(加密,os,re,json)
    一.加密讲解加密算法:md5\rsa\AES\des\base(一)base64加解密importbase64a=base64.b64encode(b"123456")print(a)#加密#b'MTIzNDU2'b=base64.b64decode(b'MTIzNDU2')print(b)#b'123456'http://encode.chahuo.com/在线加解密hashlib......
  • 10个html+css+js 绚丽按钮合集(2)
    前言:哈喽,大家好,今天给大家分享10个html+css+js绚丽按钮合集(2)!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • 音频剪辑界的‘四大天王’来袭,打工人也能秒变调音师
    在这个数字化的时代,声音不仅仅是传递信息的工具,它还承载着丰富的情感。就像夜空中最亮的星星一样,它引导着我们这些追求完美的声音爱好者,在音乐的世界里自由探索。今天,让我们一起来认识一下音频剪辑界的"四大天王"。有了他们的帮助,即使是我们这些普通的打工人,也能轻松变成调音高......
  • 使用nvm切换Node.js版本
    一、安装nvmnvm(NodeVersionManager)是一个用于管理Node.js版本的工具,它允许你在同一台机器上安装和切换多个Node.js版本。1.安装nvm    https://github.com/coreybutler/nvm-windows  访问以上链接到github去下载 点击releases         下载......
  • nginx反向代理配置https和http能同时访问后,发现一些页面使用http访问正常,使用https访
    报错:Thisrequesthasbeenblocked;thecontentmustbeservedoverHTTPS,如下图: 问题原因:HTTPS页面里动态的引入了HTTP资源,比如引入一个js文件,会被直接block掉的.在HTTPS页面里通过AJAX的方式请求HTTP资源,也会被直接block掉。 解决方法一:(没试过,要改的页面太多了,没有使......
  • 【待做】【WEB安全】浅谈JSONP劫持漏洞
    一、JSONP二、JSONP劫持示例三、JSONP劫持绕过方法3.1Referer过滤(常规)不严格3.2空引用绕过3.3回调可以定义引起的安全问题3.4测试HTML代码四、JSONP修复JSONPJSONP的全称是JSONwithPadding,是一种基于JSON格式来解决跨域请求资源的方案。由于......