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 ...
随机推荐
- 超星读书下载的pdz文件如何转为pdf文件详细教程(亲测有效)
前言: 你还在为超星读书下载的pdz格式书籍而烦恼吗?还在为不知道怎么将pdz格式转为pdf格式而气愤吗?请看以下教程. 流程: 使用超星阅读器将pdz文件转换为.xps或.oxps文件 利用第三方软 ...
- 内存与CPU:计算机默契交互的关键解析
内存 内存和CPU之间的交互是计算机体系结构中至关重要的一部分.它们之间的互动类似于一对不可分割的爱侣,彼此相互依赖且密不可分.没有内存,CPU无法执行程序指令,这样计算机就会变得毫无意义.同样地,如 ...
- Android dumpsys介绍
目录 一.需求 二.环境 三.相关概念 3.1 dumpsys 3.2 Binder 3.3 管道 四.dumpsys指令的使用 4.1 dumpsys使用 4.2 dumpsys指令语法 五.详细设 ...
- Unity - UIWidgets 3. 页面跳转
Flutter的Route概念, 移动开发常指Page, 在android中指activity, ios中指viewcontroller, UGUI中常称为Panel\Form\View? 大概说的就 ...
- 9.24 多校联测 Day4 总结
没有罚坐,但好像什么也没做. 反向挂分,RP++. 开考推 T1 的 k=2.推推推,写写写,假了.又假了.还是假的. 此时已过去 1h,开 T2,没有看懂题,又看了一会依旧没有看懂. 开 T3.尝试 ...
- P4870 [BalticOI 2009 Day1]甲虫 题解
题目链接 简要题意 在一个数轴上有 \(n\) 滴露水,每滴露水初始水量为 \(m\),每秒会蒸发一滴水,一个甲虫初始在原点,速度为 1,水能瞬间喝完,问它最多能喝到几滴水. 题目分析 对于这种移动区 ...
- Prometheus+Grafana实现服务性能监控:windows主机监控、Spring Boot监控、Spring Cloud Alibaba Seata监控
1.Prometheus介绍 Prometheus使用Go语言开发,中文名称叫:普罗 米修斯.Prometheus是一个开源系统最初在SoundCloud构建的监控和警报工具包.自 2012 年成立以 ...
- 企业微信获取code
String url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+AuthUtil.APPID + ...
- L2-034 口罩发放
重点在阅读理解能力 身份证号必须是18位数字,话说平时咱们身份证也可以带个X啥的啊. 合法状态就是只要身份证合格就行,一开始我还想是它犯病,然后申请了口罩才算一个合法记录. 后边输出状态为1的人,一定 ...
- python之特殊属性和特殊方法
目录 特殊属性 __dict__查看属性和方法 __class__查看对象所属类 __bases__查看子类的父类 __mro__查看类的层次结构 __subclasses__查看父类被继承的子类 特 ...