利用RecordRTC.js实现H5录音功能

article/2025/10/15 6:40:09

前言:

最近遇到 要语音转文字 的需求,语音转文字肯定要先搞定录音功能,在网上找了好久没找到具体的 RecordRTC.js 插件的使用方法,最后只能对着 github 上开源代码小试了一下,录音功能好使所以就记录一下叭

一、RecordRTC.js 源码指路

https://github.com/muaz-khan/RecordRTC

二、功能逻辑分析

需求分析:用户点击语音按钮->请求麦克风权限,语音按钮编程文本按钮,文本输入框显示为“按住说话” ->用户按住输入框说话->显示语音录入的动画,同时文本输入框显示为“松开结束”->用户松开即结束录音,将录音文件传给后端,后端进行转文字

三、使用方法

1、从下载的源码中将RecordRTC.js 文件引入放在项目js文件中,并在项目中引用

2.新建js文件 audioRTC.js书写自己的功能逻辑代码 

3、参照源码simple-demos->audio-recording.html 文件完成js代码

4、函数功能记录

captureMicrophone  获取麦克风权限

replaceAudio 释放麦克风(根据具体需求使用,我这里未释放)

recorder.startRecording() ->开始录音 (recorder 为实例对象)

recorder.stopRecording() ->结束录音

stopRecordingCallback 结束录音的回调函数

四、功能代码书写

1、准备 捕获麦克风函数

var isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveOrOpenBlob || !!navigator.msSaveBlob);var recorder; // globally accessible
var microphone;  // 麦克风
// 捕获麦克风
function captureMicrophone(callback) {console.log("捕获麦克风函数调用")if (microphone) {callback(microphone);return;}// 没有媒体设置告知版本低if (typeof navigator.mediaDevices === 'undefined' || !navigator.mediaDevices.getUserMedia) {var sys = isAndroidOrIOSOrPc();if (sys == "pc") {layer.msg("该浏览器不支持语音录入,<br>请使用谷歌、火狐等主流浏览器。", { area: ['320px', '80px'] });} else if (sys == "ios") {layer.msg("该浏览器不支持语音录入,<br>请将您的IOS操作系统升级最新版本,并使用safari浏览器打开使用。", { area: ['320px', '80px'] });} else if (sys == "android") {layer.msg("该浏览器不支持语音录入,<br>请使用系统自带浏览器打开使用。", { area: ['320px', '80px'] });} else {layer.msg("您当前的操作系统不支持语音录入。", { area: ['300px', '50px'] });}}// 获取设备的录音权限navigator.mediaDevices.getUserMedia({audio: isEdge ? true : { echoCancellation: false }}).then(function(mic) {console.log("获取麦克风成功回调",mic)callback(mic);}).catch(function(error) {console.log("获取麦克风失败回调",error)layer.msg("该浏览器不支持语音录入。<br>或您拒绝了语音授权", { area: ['300px', '60px'] });// 禁用麦克风走这里-》禁用语音按钮// 按钮背景换成语音$("#recordMess").css({"background":"url(images/noyuyin.png) no-repeat center","background-size":" 100% 100%",})$("#recordMess").attr('disabled',true);$('#chatform').children("#messCon").show();$('#chatform').children("#talkmess_btn").hide();})
}

2、按住输入框开始录音,封装录音函数

// 开始录音
function startRec() {var options = {type: 'audio',numberOfAudioChannels: 1,checkForInactiveTracks: false,bufferSize: 4096,recorderType: StereoAudioRecorder};if (recorder) {recorder.destroy();recorder = null;}// recordre 实例recorder = RecordRTC(microphone, options);recorder.startRecording(); //开始录音
};

3、停止录音回调

//停止录音的回调
function stopRecordingCallback() {// console.log("停止录音回调")var internalRecorder = recorder.getInternalRecorder();console.log("停止录音回调internalRecorder",internalRecorder)// 左声道var leftchannel = internalRecorder.leftchannel;// 右声道var rightchannel = internalRecorder.rightchannel;console.log("左声道",leftchannel)console.log(("啦啦啦",internalRecorder.blob,window.URL||webkitURL).createObjectURL(internalRecorder.blob))console.log("internalRecorderBlob",internalRecorder.blob)// 将录音文件 以文件对象形式传给后端var form = new FormData()form.append("upfile",internalRecorder.blob,"recorder.wav");console.log("form",form)$.ajax({url: '后端接口地址',type:'POST',cache: false,processData: false,contentType: false,data: form,success: function(data){console.log("后端返回数据对象",data)// 根据数据进行具体操作},error:function (err) { console.log("ajaxerr",err)}})}

4、按钮绑定监听事件,调用录音相关函数

  4.1、语音按钮绑定点击事件

  var flagvoice=false;	
$("#recordMess").click(function() {if(flagvoice){$(this).css({"background":"url(images/yuyin.png) no-repeat center","background-size":" 100% 100%",})$('#chatform').children("#messCon").show();$('#chatform').children("#talkmess_btn").hide();flagvoice=false;}else{$(this).css({"background":"url(images/wenben.png) no-repeat center","background-size":" 100% 100%",})$('#chatform').children("#messCon").hide();$('#chatform').children("#talkmess_btn").show();flagvoice=true;}//  ---------------获取麦克风权限 START--------if (!microphone) {captureMicrophone(function(mic) {console.log("获取语音权限",mic)microphone = mic;});return;}//  ---------------获取麦克风权限 END--------})

  4.2、输入框绑定触摸事件,触摸按开始录音

var posStart = 0;//初始化起点坐标
var posEnd = 0;//初始化终点坐标
//长按var btnElem=document.getElementById("talkmess_btn");//获取IDbtnElem.addEventListener("touchstart", function(event) {event.stopPropagation(); // 阻止冒泡event.preventDefault();//阻止浏览器默认行为posStart = 0;posStart = event.touches[0].pageY;//获取起点坐标// btnElem.value = '松开 结束';btnElem.innerText = '松开 结束';$("#audiobg").show();// $("#audiobg>p").hide();console.log("start");console.log(posStart+'---------开始坐标');// 开始录音startRec()});

  4.3、输入框绑定触摸事件,触摸抬起结束录音

btnElem.addEventListener("touchend", function(event) {event.stopPropagation();event.preventDefault();posEnd = 0;posEnd = event.changedTouches[0].pageY;//获取终点坐标// btnElem.value = '按住 说话';btnElem.innerText = '按住 说话';console.log("End");console.log(posEnd+'---------结束坐标');if(posStart - posEnd < 100 ){// $("#audiobg>p").hide();console.log("发送成功");// recStop()recorder.stopRecording(stopRecordingCallback);}else{// $("#audiobg>p").show();console.log("取消发送");console.log("Cancel");};$("#audiobg").hide();});

4.4、为测试前端是否真的拿到用户语音输入的内容,可以加一个测试按钮用于下载用户语音

// 获取文件名的随机字符串
function getRandomString() {if (window.crypto && window.crypto.getRandomValues && navigator.userAgent.indexOf('Safari') === -1) {var a = window.crypto.getRandomValues(new Uint32Array(3)),token = '';for (var i = 0, l = a.length; i < l; i++) {token += a[i].toString(36);}return token;} else {return (Math.random() * new Date().getTime()).toString(36).replace(/\./g, '');}
}
// 文件名
function getFileName(fileExtension) {var d = new Date();var year = d.getFullYear();var month = d.getMonth();var date = d.getDate();return 'RecordRTC-' + year + month + date + '-' + getRandomString() + '.' + fileExtension;
}
// 下载录音
function downloadRecording(){console.log("下载录音")if(!recorder || !recorder.getBlob()) return;var blob = recorder.getBlob();var file = new File([blob], getFileName('wav'), {type: 'audio/wav'});invokeSaveAsDialog(file); // 该方法在recorderRTC.js中已有
}
// 下载按钮绑定点击事件
var download = document.getElementById("download")download.addEventListener("click",function(){downloadRecording()
})

五、存在问题

完成上述代码之后,经测试发现该功能在安卓手机上正常,但是在一些较老版本的ios系统上(如 iPhone 7Plus iphone xs)存在只能录音一次的问题,解决方案:在结束录音函数中判断设备是ios即释放麦克风,在开始录音中判断麦克风是否存在并再调用一次开始录音函数,具体代码如下:

// 释放麦克风
function releaseMicrophone(){if(microphone) {microphone.stop();microphone = null;}}
// 判断设备是否是ios
var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
//停止录音的回调
function stopRecordingCallback() {// --------此处省略结束录音回调函数,代码同上,仅追加对于ios的判断--------------if(isSafari){releaseMicrophone()}
}
// 开始录音
function startRec() {
// -----------新增补充代码 start-------------if (!microphone) {captureMicrophone(function(mic) {microphone = mic;// click(btnStartRecording);startRec()});return;}
// -----------新增补充代码 end-------------var options = {type: 'audio',numberOfAudioChannels: 1,checkForInactiveTracks: false,bufferSize: 4096,sampleRate:48000,recorderType: StereoAudioRecorder};if (recorder) {recorder.destroy();recorder = null;}// recordre 实例recorder = RecordRTC(microphone, options);recorder.startRecording(); //开始录音
};

http://chatgpt.dhexx.cn/article/HIy9aUXP.shtml

相关文章

vue录音+js-audio-recorder

小小记录一下项目中用到的录音功能 1.下载插件 npm i js-audio-recorder 2.展示代码 <template><div style"padding: 20px;"><div style"font-size:14px"><h3>录音时长&#xff1a;{{ recorder && recorder.duration.…

html 苹果微信录音js,微信js-sdk 录音功能的示例代码

需求描述 制作一个H5页面&#xff0c;打开之后可以录音&#xff0c;并将录音文件提交至后台 微信录音最长时长为1min 代码如下 // isVoice&#xff1a; 0-未录音 1-录音中 2-录完音 // 点击录音/录音中 按钮展示 点击录音 // isListen // 0-未试听/试听结束 1-试听中 2-暂停试听…

已解决:H5移动端网页实现录音功能,js实现录音功能,包括安卓webview接口也可以使用

遇到一个需求&#xff0c;需要做一个手机网页录音的功能&#xff0c;嵌入到webview中去&#xff0c;用安卓原生录音倒是可以&#xff0c;但是想着尽量去安卓化开发&#xff0c;就想着用纯的js前端代码去实现录音功能。 在 Web 应用程序中&#xff0c;JavaScript 是运行在浏览器…

网页录音时的麦克风权限问题解决

来源 | https://www.html.cn/web/html/19184.html 在我们进行网页制作时可能会遇到需要录音的情况&#xff0c;而在进行网页录音时又有可能会遇到麦克风权限问题导致无法录音&#xff0c;本文就来为大家介绍一下如何解决麦克风权限问题。 在本地中打开的时候&#xff0c;谷歌、…

获取摄像头和麦克风权限_js获取浏览器摄像头和麦克风权限

前言 项目中会使用到摄像头或麦克风设备&#xff0c;这就需要我们获取浏览器的摄像头和麦克风权限&#xff0c;权限是无法通过js操控的&#xff0c;必须由浏览器用户设置。 下面我来告诉大家如何获取浏览器的摄像头或麦克风的权限&#xff0c;使浏览器弹出询问窗口。 一、我们想…

(前端)录音功能实现 js-audio-recorder

1. 创建 import Recorder from js-audio-recorder const parameter {sampleBits: 16, // 采样位数&#xff0c;支持 8 或 16&#xff0c;默认是16sampleRate: 8000, // 采样率&#xff0c;支持 11025、16000、22050、24000、44100、48000&#xff0c;根据浏览器默认值&#x…

Android webview录音权限和音频自动播放

项目背景&#xff1a;我们通过layabox&#xff0c;制作了H5页面&#xff0c;可以在微信中&#xff0c;手机浏览器中使用&#xff0c;现在需要将H5页面集成到Android的APP中。 遇到的问题&#xff1a; 1.遇到的第一个问题&#xff0c;是获取录音权限的问题&#xff0c;我已经给…

html 苹果微信录音js,基于JS开发微信网页录音功能的实例代码

具体代码如下所示&#xff1a; wx.ready(function () { var startRecordflag false var startTime null //btnRecord 为录音按钮dom对象 btnRecord.addEventListener(touchstart, function (event) { event.preventDefault(); startTime newDate().getTime(); // 延时后录音…

std::string 与 std::wstring 互转

前言: 最近接触了一些 win32 方便的编程,由于不熟 可能会写一写这方便的基础东西 相当于 写日记了 提升一下 他们的声明 string 是 char wstring 是wchar_t 什么是wchar_t ? string 转 wstring inline std::wstring StringToWString(const std::string& str) {int len…

C++ 字符串string、字符char、宽字符数组wstring、宽字符wchar_t互相转换(2021.4.20)

C单字符串和宽字符串学习 2021.4.20 1、char 和 string1.1 单字符 char1.2 单字符数组 char[] 和 char*1.2.1 char[]1.2.2 char* 1.3 单字符串 string1.4 char[] 转 string1.5 cha[] 转char*1.6 string 转 char*1.7 string 转 char[] 2、wchar_t 和 wstring2.1 宽字符 wchar_t2…

string和wstring相互转换以及wstring显示中文问题

如果你只是使用C来处理字符串&#xff0c;会用到string。不过string是窄字符串ASCII&#xff0c;而很多Windows API函数用的是宽字符Unicode。这样让string难以应对。作为中国的程序员&#xff0c;我们第一个想到的字符串就是中文&#xff0c;而不是英文。所以经常会遇到中文字…

C++里面,什么时候使用std::wstring

看你要使用什么字符编码了&#xff0c; std::wstring主要用于 UTF-16编码的字符,而std::string主要用于存储单字节的字符( ASCII字符集 )&#xff0c;但是也可以用来保存UTF-8编码的字符。&#xff08;UTF-8和UTF-16是UNICODE字符集的两种不同的字符编码&#xff09; 如果你的…

String类与wstring类的区别

String类与wstring类的区别 本质区别 存储字符的区别 #include <iostream> #include <string> using namespace std; int main() { wstring wstr1 L"你好世界"; // L普通字符串 宽字符串 const wchar_t *ch1 wstr1.c_str(); // 转化为宽字符…

从新建工程开始使用C++开发单片机(以STM32为例):七、移植Arduino的WString(附代码)

在上一篇文章中&#xff0c;介绍了outputString和inputString&#xff0c;其中所运用到的字符串类型String也是C驱动层中功能强大且重要的一个类。这个类移植自Arduino的WString。这篇文章将会展示WString的易用性&#xff0c;并且从编译输出后程序大小的角度比较WSting和C std…

0005:Qt常用类 - QDateTime

Qt常用类 - QDateTime 1 开发环境 在介绍内容之前&#xff0c;先说明一下开发环境&#xff0c;如下图&#xff1a; Qt版本&#xff1a;Qt5.3.2&#xff1b; Qt开发工具&#xff1a;Qt Creater 3.2.1&#xff1b; Qt构建工具&#xff1a;Desktop Qt 5.3 MinGW 32bit&#xff…

QDateTime的11种显示方式

QDateTime datetime QDateTime::currentDateTime(); datetime.toString(“hh:mm:ss\nyyyy/MM/dd”); datetime.toString(“hh:mm:ss ap\nyyyy/MM/dd”); datetime.toString(“hh:mm:ss\nyyyy-MM-dd”); datetime.toString(“hh:mm:ss ap\nyyyy-MM-dd”); datetime.to…

70 QDateTime时间戳转换有误

1 前言 在开发工具中需要用时间戳转换成格式化时间来显示&#xff0c;但引用QT中自带的时间类QDateTime转换时&#xff0c;发现转换时间有误问题&#xff0c;转换的结果时分秒是正确的&#xff0c;但月份确实错误的。因此在未深入研究qt实现情况下&#xff0c;需要得到正确的格…

QDateTime类的部分函数使用解析

QDateTime类提供了日期和时间功能。 QDateTime对象包含一个日历日期和一个时钟时间&#xff08;一个“日期时间”&#xff09;。它是QDate和QTime两个类的组合。它可以从系统时钟中读取当前日期时间。它提供比较日期时间和操作日期时间的函数&#xff0c;比如加上一定数量的秒…

QDateTime时间相减

qDebug()<<"span"<<QDateTime::fromMSecsSinceEpoch(QDateTime::currentDateTime().toMSecsSinceEpoch() - time.toMSecsSinceEpoch()).toUTC().toString("hh:mm:ss"); 1、使用 QDateTime::toMSecsSinceEpoch 计算时间差&#xff1b; 2、使用…

小心 QDateTime

QDateTime 时间跳变问题接收服务端时间问题 时间跳变问题 QDateTime的具体用法可以在Qt creator 鼠标双击选中&#xff0c;按 F1 查看它的文档, Qt 的文档还是不错的. 我们有时会用下面的代码来做等待, 在笔者使用过程中发现 //等待QDateTime n QDateTime::currentDateTime(…