js-audio-pluging(录音)
安装
npm i js-audio-recorder
代码
<template>
<div class="BaseRecorder">
<div class="BaseRecorder-record">
<el-button @click="startRecorder()" :disabled="recorder_state !== '无'">开始录音</el-button>
<el-button @click="pauseRecorder()">暂停录音</el-button>
<el-button @click="resumeRecorder()">继续录音</el-button>
<el-button @click="stopRecorder()" :disabled="recorder_state === '无'">结束录音</el-button>
</div>
<div class="BaseRecorder-play">
<el-button @click="playRecorder()" :disabled="play_state !== '无'">录音播放</el-button>
<el-button @click="pausePlayRecorder()">暂停录音播放</el-button>
<el-button @click="resumePlayRecorder()">恢复录音播放</el-button>
<el-button @click="stopPlayRecorder()" :disabled="play_state === '无'"
>停止录音播放</el-button
>
</div>
<div class="BaseRecorder-download">
<el-button @click="downPCM()">下载PCM格式录音</el-button>
<el-button @click="downWAV()">下载WAV格式录音</el-button>
</div>
<div class="BaseRecorder-destroy">
<el-button type="error" @click="destroyRecorder()">销毁录音</el-button>
</div>
<div class="BaseRecorder-wave">
<p class="recorder_state">{{ recorder_state }}</p>
<canvas ref="record"></canvas>
<p class="recorder_state">{{ play_state }}</p>
<canvas ref="play"></canvas>
</div>
</div>
</template> <script>
import Recorder from 'js-audio-recorder'; // let recorder = new Recorder(); export default {
data() {
return {
recorder: null,
// 波浪图-录音
drawRecordId: null,
// 波浪图-播放
drawPlayId: null,
// 录音状态
recorder_state: '无',
// 播放状态
play_state: '无',
};
},
mounted() {
this.init();
},
methods: {
// 初始化
init() {
this.recorder = new Recorder({
// 采样位数,支持 8 或 16,默认是16
sampleBits: 16,
// 采样率,支持 11025、16000、22050、24000、44100、48000,根据浏览器默认值
sampleRate: 48000,
// 声道,支持 1 或 2, 默认是1
numChannels: 1,
// 是否边录边转换,默认是false
compiling: false,
});
},
// 开始录音
startRecorder() {
this.recorder.start().then(
() => {
this.drawRecord();
this.recorder_state = '录音中...';
},
error => {
// 出错了
console.log(`${error.name} : ${error.message}`);
},
);
},
// 继续录音
resumeRecorder() {
this.recorder.resume();
this.drawRecord();
this.recorder_state = '录音中...';
},
// 暂停录音
pauseRecorder() {
this.recorder.pause();
this.recorder_state = '暂停录音';
this.drawRecordId && cancelAnimationFrame(this.drawRecordId);
this.drawRecordId = null;
},
// 结束录音
stopRecorder() {
this.recorder.stop();
this.drawRecordId && cancelAnimationFrame(this.drawRecordId);
this.drawRecordId = null;
this.recorder_state = '无';
},
// 录音播放
playRecorder() {
this.recorder.play();
this.drawPlay(); // 绘制波浪图
this.play_state = '录音播放中';
},
// 暂停录音播放
pausePlayRecorder() {
this.recorder.pausePlay();
this.play_state = '录音暂停播放';
},
// 恢复录音播放
resumePlayRecorder() {
this.recorder.resumePlay();
this.drawPlay(); // 绘制波浪图
this.play_state = '录音播放中';
},
// 停止录音播放
stopPlayRecorder() {
this.recorder.stopPlay();
this.play_state = '无';
},
// 销毁录音
destroyRecorder() {
this.recorder.destroy().then(() => {
console.log(this.drawRecordId, this.drawPlayId);
this.drawRecordId && cancelAnimationFrame(this.drawRecordId);
this.drawRecordId = null; this.drawPlayId && cancelAnimationFrame(this.drawPlayId);
this.drawPlayId = null; this.init();
});
}, /**
* 下载录音文件
* */
// 下载pcm
downPCM() {
// 这里传参进去的时文件名
this.recorder.downloadPCM('新文件');
},
// 下载wav
downWAV() {
// 这里传参进去的时文件名
this.recorder.downloadWAV('新文件');
}, /**
* 绘制波浪图-录音
* */
drawRecord() {
this.drawRecordId = requestAnimationFrame(this.drawRecord);
this.drawWave({
canvas: this.$refs.record,
dataArray: this.recorder.getRecordAnalyseData(),
bgcolor: 'white',
lineWidth: 1,
lineColor: 'red',
});
},
/**
* 绘制波浪图-播放
* */
drawPlay() {
this.drawPlayId = requestAnimationFrame(this.drawPlay);
this.drawWave({
canvas: this.$refs.play,
dataArray: this.recorder.getPlayAnalyseData(),
});
},
drawWave({
canvas,
dataArray,
bgcolor = 'rgb(200, 200, 200)',
lineWidth = 2,
lineColor = 'rgb(0, 0, 0)',
}) {
if (!canvas) return; const ctx = canvas.getContext('2d');
const bufferLength = dataArray.length;
// 一个点占多少位置,共有bufferLength个点要绘制
const sliceWidth = canvas.width / bufferLength;
// 绘制点的x轴位置
let x = 0; // 填充背景色
ctx.fillStyle = bgcolor;
ctx.fillRect(0, 0, canvas.width, canvas.height); // 设定波形绘制颜色
ctx.lineWidth = lineWidth;
ctx.strokeStyle = lineColor; ctx.beginPath(); for (let i = 0; i < bufferLength; i++) {
const v = dataArray[i] / 128;
const y = (v * canvas.height) / 2; if (i === 0) {
// 第一个点
ctx.moveTo(x, y);
} else {
// 剩余的点
ctx.lineTo(x, y);
}
// 依次平移,绘制所有点
x += sliceWidth;
} // 最后一个点
ctx.lineTo(canvas.width, canvas.height / 2);
ctx.stroke();
},
},
};
</script>
<style scoped> </style>
这是在网上找的代码,然后本地测试成功
js-audio-pluging(录音)的更多相关文章
- Unity-WebGL基于JS实现网页录音
因为该死的Unity不支持WebGL的麦克风,所以只能向网页借力,用网页原生的navigator.getUserMedia录音,然后传音频流给Unity进行转AudioClip播放. 还有一点非常重要 ...
- Audio Capture 录音
The Android multimedia framework includes support for capturing and encoding a variety of common aud ...
- js audio 播放音乐
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- JS audio播放一个的时候,其他正在播放的关闭
audio在使用中,如果有多个,在播放的时候,如果一个声音没有播放完继续下一个的话,原来正在播放的并不会关闭(在Android和PC上测试是这样,苹果产品不清楚) 现在需要做的是,当播放其中一个的时候 ...
- python 全栈开发,Day123(图灵机器人,web录音实现自动化交互问答)
昨日内容回顾 . 百度ai开放平台 . AipSpeech技术,语言合成,语言识别 . Nlp技术,短文本相似度 . 实现一个简单的问答机器人 . 语言识别 ffmpeg (目前所有音乐,视频领域,这 ...
- 图灵机器人,web录音实现自动化交互问答
一.图灵机器人 介绍 图灵机器人 是以语义技术为核心驱动力的人工智能公司,致力于“让机器理解世界”,产品服务包括机器人开放平台.机器人OS和场景方案. 官方地址为: http://www.tuling ...
- 你需要了解的JS框架
excanvas.js/Chart.js/cubism.js/d3.js/dc.js/dx.chartjs.js/echarts.js/flot.js 用途:构建数据统计图表,兼容多浏览器 ...
- 5款帮助简化的HTML5 Audio开发的Javascript类库
HTML5的audio标签提供了我们方便控制声音的功能,可是使用原生的HTML5来开发声音或者音乐相关的项目仍旧很的麻烦.在今天这篇文章中,我们将介绍5款帮助你简化开发的javascript audi ...
- ios录音Demo
<AudioToolbox/AudioToolbox.h> :这个库是C的接口,偏向于底层,主要用于在线流媒体的播放 <AVFoundation/AVFoundation.h> ...
- 前端开发需要了解的JS插件
excanvas.js/Chart.js/cubism.js/d3.js/dc.js/dx.chartjs.js/echarts.js/flot.js 用途:构建数据统计图表,兼容多浏览器 jquer ...
随机推荐
- CefSharp自定义滚动条样式
在WinForm/WPF中使用CefSharp混合开发时,通常需要自定义滚动条样式,以保证应用的整体风格统一.本文将给出一个简单的示例介绍如何自定义CefSharp中滚动条的样式. 基本思路 在前端开 ...
- PostgreSQL学习笔记-7.基础知识:子查询、自增、PRIVILEGES 权限
子查询 子查询或称为内部查询.嵌套查询,指的是在 PostgreSQL 查询中的 WHERE 子句中嵌入查询语句.一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询可以与 SELEC ...
- OSPF常用配置和常用的查看命令
转载请注明出处: 1.启动OSPF进程,进入OSPF视图. [Huawei] ospf [ process-id | Router ID Router ID ] 路由器支持OSPF多进程,进程号是本地 ...
- Excel--比较两列数据的异同
首先得到的数据分为两列,两种类型.由于在网站上搜索的时候,网站的"特殊性"会将000638-32-4 前面的0全部去掉.变成了638-32-4.基于得到了两列稍有不同的数据.由于人 ...
- 产品代码都给你看了,可别再说不会DDD(七):实体与值对象
这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...
- 【matplotlib 实战】--漏斗图
漏斗图,形如"漏斗",用于展示数据的逐渐减少或过滤过程.它的起始总是最大,并在各个环节依次减少,每个环节用一个梯形来表示,整体形如漏斗.一般来说,所有梯形的高度应是一致的,这会有助 ...
- Util应用框架核心(三) - 服务注册器
本节介绍服务注册器的开发. 如果你不需要扩展Util应用框架,直接跳过. 当你把某些功能封装到自己的类库,并希望启动时自动执行初始化代码进行配置时,定义服务注册器. 服务注册器概述 服务注册器是Uti ...
- JAVA类的加载(2) ——按需加载(延迟加载)
1.例1: 1 /* 2 按需加载:当你不去实例化Cat时,Cat相关类都不会被加载,即按需加载(需要时加载) 3 1.先加载父类 4 2.初始化类 5 3.类只加载一次(暂且这么认为)--缓存 6 ...
- Excel 使用 VLOOKUP 函数匹配特定列
前言 工作有一项内容,是根据新的表格的某一列的内容一对一匹配,生成一列新的表格.这就用到了 Excel 的 VLOOKUP 函数. 函数使用 函数体: =VLOOKUP(lookup_value,ta ...
- 发现AI自我意识:知识及其载体
知识的量子态 在回答什么是"理解"之前,我们先来讨论一下知识和其载体的定义.知识本身是一个抽象的概念,它可以被编码到各种物质载体中.无论是纸质书籍,还是人类大脑中的神经连接,抑或是 ...