当前位置: 首页 > 知识库问答 >
问题:

javascript - 这种根据录音时分贝大小实时展现波浪大小的效果如何实现?

孟花蜂
2023-10-19

image.png
如上图左边那个图形的波浪效果,这个是evc录频那里截来的效果。现在做好录音基本功能,就想在录音时加个动画效果。
现有代码如下:

<template>    <!-- 录音demo -->    <div>        <el-card>            <h1>录音</h1>            <!-- 录音区域 -->            <div style="margin-top:10px;">                <div ref="timer">{{ time }}</div>                <!-- 操作按钮区域 -->                <div style="margin-top:10px;">                    <el-button type="primary" @click="startRecord" :disabled="startBtn">开始录音</el-button>                    <el-button type="primary" @click="stopRecord" :disabled="stopBtn">暂停录音</el-button>                    <el-button type="primary" @click="reRecord" :disabled="resumeBtn">恢复录音</el-button>                    <el-button type="primary" @click="endRecord" :disabled="endBtn">结束录音</el-button>                </div>                <audio ref="recordPlayer" controls src="" style="margin-top: 10px;" />                <el-button type="primary" @click="download">下载录音文件</el-button>            </div>        </el-card>    </div></template><script>export default {    components: {    },    data() {        return {            mediaRecorder: '',//MediaRecorder对象实例            time: '00:00',            timer: null,//定时器            startBtn: false,            stopBtn: true,            resumeBtn: true,            endBtn: true,            lastTime: '',//上一次暂停的时间            file: ''//录音完成的File文件对象        }    },    computed: {    },    created() {    },    mounted() {    },    methods: {        // 开始录音        startRecord() {            this.startBtn = true            this.stopBtn = false            this.endBtn = false            //只录制音频            navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {                console.log('音频流', stream)                //创建一个MediaRecorder对象实例,以供音频的录入                this.mediaRecorder = new MediaRecorder(stream)                console.log('录音对象', this.mediaRecorder)                this.mediaRecorder.start() //开始录音                this.mediaRecorder.onstart = () => {                    // 录音开始计时                    const start = Date.now();                    this.timer = setInterval(() => {                        const diff = Date.now() - start;                        const minutes = Math.floor(diff / (1000 * 60));                        const seconds = Math.floor((diff % (1000 * 60)) / 1000);                        // const milliseconds = Math.floor((diff % 1000) / 10);//毫秒去掉                        this.time = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;                    }, 10);                }            }).catch((error) => {                console.log(error)                this.$alert('开启麦克风失败!')            })        },        //结束录音        endRecord() {            this.startBtn = false            this.stopBtn = true            this.resumeBtn = true            this.endBtn = true            this.mediaRecorder.stop()            this.mediaRecorder.onstop = () => {                //录音结束                clearInterval(this.timer);                //重置时间                this.time = '00:00'            }            //监听是否新的录音对象生成            this.mediaRecorder.addEventListener('dataavailable', (event) => {                //监听录音结束后将录制的音频放入audio标签                this.$refs.recordPlayer.src = URL.createObjectURL(event.data)                let blob = event.data//blob对象                console.log(blob)                console.log(blob.size)                let size = blob.size / 1024 / 1024                console.log('blob文件大小', size)                //blob对象转file文件对象                let file = new File([blob], '录音文件1', { type: "audio/mp3" })                this.file = file                console.log(file)            })        },        //暂停录音        stopRecord() {            this.stopBtn = true            this.resumeBtn = false            this.mediaRecorder.pause()            this.mediaRecorder.onpause = () => {                //暂停录音,停止当前计时                clearInterval(this.timer);                this.lastTime = this.time            }        },        //恢复录音        reRecord() {            this.resumeBtn = true            this.stopBtn = false            this.mediaRecorder.resume()            this.mediaRecorder.onresume = () => {                //恢复录音,恢复当前计时                const start = Date.now();                this.timer = setInterval(() => {                    const diff = Date.now() - start;                    const minutes = Math.floor(diff / (1000 * 60));                    const seconds = Math.floor((diff % (1000 * 60)) / 1000);                    // const milliseconds = Math.floor((diff % 1000) / 10);//毫秒去掉                    let time = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;                    let lastTime = this.lastTime                    let [ah, al] = lastTime.split(':');                    let [bh, bl] = time.split(':');                    // Convert hour and minute to numbers                      let ahour = parseInt(ah);                    let almin = parseInt(al);                    let bhour = parseInt(bh);                    let bmin = parseInt(bl);                    // Add minutes to get total minutes                      let totalMin = (ahour * 60 + almin) + (bhour * 60 + bmin);                    // Convert total minutes back to hours and minutes                      let totalHours = Math.floor(totalMin / 60);                    let totalMins = totalMin % 60;                    // Store the result                      this.time = `${totalHours.toString().padStart(2, '0')}:${totalMins.toString().padStart(2, '0')}`;                }, 10);            }        },        //下载录音文件        download() {            // 创建a标签              var link = document.createElement("a");            link.href = URL.createObjectURL(this.file);            link.download = "录音文件1.mp3";            // 添加到DOM中并模拟点击下载              document.body.appendChild(link);            link.click();            // 从DOM中移除a标签              document.body.removeChild(link);        }    },}</script><style scoped></style>  

共有1个答案

燕翔飞
2023-10-19

查看本站文章:

https://segmentfault.com/a/1190000021613428

MDN官方教程:

https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Audio_AP...
 类似资料:
  • 本文向大家介绍iOS实现波浪效果,包括了iOS实现波浪效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了iOS实现波浪效果的具体代码,供大家参考,具体内容如下 代码: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍Android实现波浪线效果(xml bitmap),包括了Android实现波浪线效果(xml bitmap)的使用技巧和注意事项,需要的朋友参考一下 我们要实现的效果如下: 在这之前先带大家了解一下xml bitmap,何为XML Bitmap? XML Bitmap 是一个用XML定义的文件放在资源目录,定义的对象是图片,为bitmap定义别名,这个文件可以给bitmap定义一

  • 本文向大家介绍WPF实现3D粒子波浪效果,包括了WPF实现3D粒子波浪效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了WPF实现3D粒子波浪效果的具体代码,供大家参考,具体内容如下 实现效果如下: 步骤: 1、3D粒子类Particle.cs 2、粒子系统ParticleSystem类 3、Viewport布局 4、交互逻辑 以上就是本文的全部内容,希望对大家的学习有所帮助,也希

  • 就是鼠标点击左边的栏目,右边的缓缓的定位到栏目,这种用什么做?有相应的插件还是手写js。

  • 本文向大家介绍原生js实现图片放大缩小计时器效果,包括了原生js实现图片放大缩小计时器效果的使用技巧和注意事项,需要的朋友参考一下 知识要点 var fn=setInterval(function(){},1000) 每隔1秒执行一次函数 clearInterval(fn) 清除计时器 判断当图片放大缩小到固定大小时,清除计时器 完整代码 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作

  • 本文向大家介绍javascript运动框架用法实例分析(实现放大与缩小效果),包括了javascript运动框架用法实例分析(实现放大与缩小效果)的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript运动框架用法。分享给大家供大家参考,具体如下: 该运动框架可以实现多物体任意值运动 运行效果截图如下: 例子: 更多关于JavaScript运动效果相关内容可查看本站专题:《Ja