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

这篇具有很好参考价值的文章主要介绍了利用RecordRTC.js实现H5录音功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

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

一、RecordRTC.js 源码指路

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

二、功能逻辑分析

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

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

三、使用方法

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");//获取ID
	btnElem.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即释放麦克风,在开始录音中判断麦克风是否存在并再调用一次开始录音函数,具体代码如下:文章来源地址https://www.toymoban.com/news/detail-454527.html

// 释放麦克风
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(); //开始录音
};

到了这里,关于利用RecordRTC.js实现H5录音功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【uniapp】使用permission获取录音权限及实现录音功能

    需求 app获取录音权限权限, 实现录音并且播放功能 实现 一. 使用permission获取录音权限 原博 : https://www.wanjunshijie.com/note/uniapp/3203.html 1.1 安卓 : manifest.json 配置权限 android.permission.RECORD_AUDIO **ios : manifest.json模块配置 Record ** 1.2 permision使用和下载 ( 自行百度搜索即可 ) 1.3 获取录音

    2024年02月12日
    浏览(52)
  • Android 实现录音功能

    通过媒体录制器MediaRecorder实现:MediaRecorder是Android自带的音频和视频录制工具,它通过操纵摄像头和麦克风完成媒体录制,既可录制视频,又可单独录制音频。 reset:重置录制资源。 prepare:准备录制。 start:开始录制。 stop:结束录制。 release:释放录制资源。 setOnErrorList

    2024年02月12日
    浏览(42)
  • js前端实现语言识别(asr)与录音

    实习的时候,领导要求验证一下在web前端实现录音和语音识别,查了一下发现网上有关语音识别也就是语音转文字几乎没有任何教程。 其实有一种方案,前端先录音然后把录音传到后端,后端在请求如百度语音转文字的api进行识别,但是这种就需要再写个后端。如果直接前端

    2024年02月11日
    浏览(36)
  • vue3实现H5网页录音并上传(mp3、wav)兼容Android、iOS和PC端

    使用 Recorder插件 可以在HTML5网页中进行录音,录音完成后得到blob文件对象,然后将blob上传到服务器;项目使用的vue3.0版本(这个插件同时支持vue2.0、也支持uniapp,很强!!),录音过程中会显示可视化波形,同时能够做到兼容PC端、Android、和iOS,一次编码 到处运行,哈哈

    2024年02月08日
    浏览(53)
  • Android录音功能的实现及踩坑记录

    最近接到个需求,不使用第三方SDK的情况下实现IM通讯,文字聊天已经通过MQTT实现,而语音功能目前想到的较好解决方案就是进行录音文件的上传下载。可能还有更好解决方案,但我目前没想到,有建议的小伙伴劳烦指导下。 前提 : 1、权限申请: 清单文件中加上: 对应读

    2024年02月22日
    浏览(51)
  • Unity-WebGL基于JS实现网页录音

          因为该死的Unity不支持WebGL的麦克风,所以只能向网页借力,用网页原生的navigator.getUserMedia录音,然后传音频流给Unity进行转AudioClip播放。       还有一点非常重要:能有同事借力就直接问,厚着脸皮上,我自己闷头两天带加班,不如同事谭老哥加起来提供帮助的俩小

    2023年04月08日
    浏览(47)
  • Android中使用原生MediaRecorder APi实现录音功能

    一、MediaRecorder简介 MediaRecorder是Android中的一个API,可以用来实现录音功能。它继承自android.media.MediaRecorder类,可以实现音频和视频的录制。 二、MediaRecorder的使用 1、首先,实例化一个MediaRecorder对象,并设置音频源: 2、设置音频的输出格式: 3、设置音频的编码格式: 4、设

    2024年02月09日
    浏览(46)
  • HarmonyOS实战开发-录音机、如何实现音频录制和播放的功能

    本示例使用audio相关接口实现音频录制和播放的功能,使用mediaLibrary实现音频文件的管理。 相关概念: AudioRecorder:音频录制的主要工作是捕获音频信号,完成音频编码并保存到文件中,帮助开发者轻松实现音频录制功能。它允许调用者指定音频录制的采样率、声道数、编码

    2024年04月17日
    浏览(113)
  • element-ui实现日期选择器最近一周,上一周,下一周功能

    界面部分代码: js部分:

    2024年02月11日
    浏览(42)
  • js实现H5网页飘窗

    1.div style=\\\"z-index: 1000; position: absolute; filter: Alpha(opacity = 90); width: 100px;padding: 10px; border: 1px solid #333\\\" id=\\\"img\\\" align=\\\"center\\\" a href=\\\"javascript:void(0);\\\" id=\\\"popInfo\\\" style=\\\"text-decoration: none;color:#333\\\"关于xxx的通知/a /div   js代码   script $(function() { var content = \\\'div style=\\\"margin-left: 20px;margin-right: 20px

    2023年04月27日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包