国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

利用RecordRTC.js實(shí)現(xiàn)H5錄音功能

這篇具有很好參考價(jià)值的文章主要介紹了利用RecordRTC.js實(shí)現(xiàn)H5錄音功能。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言:

最近遇到 要語音轉(zhuǎn)文字 的需求,語音轉(zhuǎn)文字肯定要先搞定錄音功能,在網(wǎng)上找了好久沒找到具體的?RecordRTC.js 插件的使用方法,最后只能對(duì)著 github 上開源代碼小試了一下,錄音功能好使所以就記錄一下叭

一、RecordRTC.js 源碼指路

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

二、功能邏輯分析

需求分析:用戶點(diǎn)擊語音按鈕->請(qǐng)求麥克風(fēng)權(quán)限,語音按鈕編程文本按鈕,文本輸入框顯示為“按住說話” ->用戶按住輸入框說話->顯示語音錄入的動(dòng)畫,同時(shí)文本輸入框顯示為“松開結(jié)束”->用戶松開即結(jié)束錄音,將錄音文件傳給后端,后端進(jìn)行轉(zhuǎn)文字

利用RecordRTC.js實(shí)現(xiàn)H5錄音功能

三、使用方法

1、從下載的源碼中將RecordRTC.js 文件引入放在項(xiàng)目js文件中,并在項(xiàng)目中引用

2.新建js文件 audioRTC.js書寫自己的功能邏輯代碼?

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

4、函數(shù)功能記錄

captureMicrophone? 獲取麥克風(fēng)權(quán)限

replaceAudio 釋放麥克風(fēng)(根據(jù)具體需求使用,我這里未釋放)

recorder.startRecording() ->開始錄音 (recorder 為實(shí)例對(duì)象)

recorder.stopRecording() ->結(jié)束錄音

stopRecordingCallback 結(jié)束錄音的回調(diào)函數(shù)

四、功能代碼書寫

1、準(zhǔn)備 捕獲麥克風(fēng)函數(shù)

var isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveOrOpenBlob || !!navigator.msSaveBlob);


var recorder; // globally accessible
var microphone;  // 麥克風(fēng)
// 捕獲麥克風(fēng)
function captureMicrophone(callback) {
  console.log("捕獲麥克風(fēng)函數(shù)調(diào)用")
  if (microphone) {
      callback(microphone);
      return;
  }
  // 沒有媒體設(shè)置告知版本低
  if (typeof navigator.mediaDevices === 'undefined' || !navigator.mediaDevices.getUserMedia) {
      var sys = isAndroidOrIOSOrPc();
      if (sys == "pc") {
          layer.msg("該瀏覽器不支持語音錄入,<br>請(qǐng)使用谷歌、火狐等主流瀏覽器。", { area: ['320px', '80px'] });
      } else if (sys == "ios") {
          layer.msg("該瀏覽器不支持語音錄入,<br>請(qǐng)將您的IOS操作系統(tǒng)升級(jí)最新版本,并使用safari瀏覽器打開使用。", { area: ['320px', '80px'] });
      } else if (sys == "android") {
          layer.msg("該瀏覽器不支持語音錄入,<br>請(qǐng)使用系統(tǒng)自帶瀏覽器打開使用。", { area: ['320px', '80px'] });
      } else {
          layer.msg("您當(dāng)前的操作系統(tǒng)不支持語音錄入。", { area: ['300px', '50px'] });
      }
  }
 // 獲取設(shè)備的錄音權(quán)限
  navigator.mediaDevices.getUserMedia({
      audio: isEdge ? true : { echoCancellation: false }
  }).then(function(mic) {
    console.log("獲取麥克風(fēng)成功回調(diào)",mic)
      callback(mic);
  }).catch(function(error) {
    console.log("獲取麥克風(fēng)失敗回調(diào)",error)
    layer.msg("該瀏覽器不支持語音錄入。<br>或您拒絕了語音授權(quán)", { area: ['300px', '60px'] });
      // 禁用麥克風(fēng)走這里-》禁用語音按鈕
      // 按鈕背景換成語音
      $("#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、按住輸入框開始錄音,封裝錄音函數(shù)

// 開始錄音
function startRec() {

  var options = {
      type: 'audio',
      numberOfAudioChannels: 1,
      checkForInactiveTracks: false,
      bufferSize: 4096,
      recorderType: StereoAudioRecorder
  };

  if (recorder) {
      recorder.destroy();
      recorder = null;
  }
  // recordre 實(shí)例
  recorder = RecordRTC(microphone, options);
  recorder.startRecording(); //開始錄音
};

3、停止錄音回調(diào)

//停止錄音的回調(diào)
function stopRecordingCallback() {
  // 
  console.log("停止錄音回調(diào)")
      var internalRecorder = recorder.getInternalRecorder();
      console.log("停止錄音回調(diào)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)
        // 將錄音文件 以文件對(duì)象形式傳給后端
      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("后端返回?cái)?shù)據(jù)對(duì)象",data)
        // 根據(jù)數(shù)據(jù)進(jìn)行具體操作
         
      
        },
        error:function (err) { 
          console.log("ajaxerr",err)
         }
    })

}

4、按鈕綁定監(jiān)聽事件,調(diào)用錄音相關(guān)函數(shù)

? 4.1、語音按鈕綁定點(diǎn)擊事件

  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;
    }
    //  ---------------獲取麥克風(fēng)權(quán)限 START--------
    if (!microphone) {
      captureMicrophone(function(mic) {
        console.log("獲取語音權(quán)限",mic)
          microphone = mic;
      });
      return;
    }
    //  ---------------獲取麥克風(fēng)權(quán)限 END--------
	})

? 4.2、輸入框綁定觸摸事件,觸摸按開始錄音

var posStart = 0;//初始化起點(diǎn)坐標(biāo)
var posEnd = 0;//初始化終點(diǎn)坐標(biāo)
//長按
	var btnElem=document.getElementById("talkmess_btn");//獲取ID
	btnElem.addEventListener("touchstart", function(event) {
    event.stopPropagation(); // 阻止冒泡
		event.preventDefault();//阻止瀏覽器默認(rèn)行為
		posStart = 0;
		posStart = event.touches[0].pageY;//獲取起點(diǎn)坐標(biāo)
    // btnElem.value = '松開 結(jié)束';
    btnElem.innerText = '松開 結(jié)束';
		$("#audiobg").show();
		// $("#audiobg>p").hide();
		console.log("start");
    console.log(posStart+'---------開始坐標(biāo)');
    // 開始錄音
    startRec()
	});

? 4.3、輸入框綁定觸摸事件,觸摸抬起結(jié)束錄音

btnElem.addEventListener("touchend", function(event) {
    event.stopPropagation();
		event.preventDefault();
		posEnd = 0;
		posEnd = event.changedTouches[0].pageY;//獲取終點(diǎn)坐標(biāo)
    // btnElem.value = '按住 說話';
    btnElem.innerText = '按住 說話';
		console.log("End");
		console.log(posEnd+'---------結(jié)束坐標(biāo)');
		if(posStart - posEnd < 100 ){
			// $("#audiobg>p").hide();
			console.log("發(fā)送成功");
      // recStop()
      recorder.stopRecording(stopRecordingCallback);
		}else{
			// $("#audiobg>p").show();
			console.log("取消發(fā)送");
			console.log("Cancel");
		};
    $("#audiobg").hide();
    
	});

4.4、為測(cè)試前端是否真的拿到用戶語音輸入的內(nèi)容,可以加一個(gè)測(cè)試按鈕用于下載用戶語音

// 獲取文件名的隨機(jī)字符串
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中已有
}
// 下載按鈕綁定點(diǎn)擊事件
var download = document.getElementById("download")
    download.addEventListener("click",function(){
      downloadRecording()
})

五、存在問題

完成上述代碼之后,經(jīng)測(cè)試發(fā)現(xiàn)該功能在安卓手機(jī)上正常,但是在一些較老版本的ios系統(tǒng)上(如 iPhone 7Plus iphone xs)存在只能錄音一次的問題,解決方案:在結(jié)束錄音函數(shù)中判斷設(shè)備是ios即釋放麥克風(fēng),在開始錄音中判斷麥克風(fēng)是否存在并再調(diào)用一次開始錄音函數(shù),具體代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-454527.html

// 釋放麥克風(fēng)
function releaseMicrophone(){
  if(microphone) {
    microphone.stop();
    microphone = null;
  }

}
// 判斷設(shè)備是否是ios
var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
//停止錄音的回調(diào)
function stopRecordingCallback() {
  // --------此處省略結(jié)束錄音回調(diào)函數(shù),代碼同上,僅追加對(duì)于ios的判斷--------------
  if(isSafari){
    releaseMicrophone()
  }
}
// 開始錄音
function startRec() {
// -----------新增補(bǔ)充代碼 start-------------
  if (!microphone) {
    captureMicrophone(function(mic) {
        microphone = mic;
        // click(btnStartRecording);
        startRec()
    });
    return;
  }
// -----------新增補(bǔ)充代碼 end-------------
  var options = {
      type: 'audio',
      numberOfAudioChannels: 1,
      checkForInactiveTracks: false,
      bufferSize: 4096,
      sampleRate:48000,
      recorderType: StereoAudioRecorder
  };

  if (recorder) {
      recorder.destroy();
      recorder = null;
  }
  // recordre 實(shí)例
  recorder = RecordRTC(microphone, options);
  recorder.startRecording(); //開始錄音
};

到了這里,關(guān)于利用RecordRTC.js實(shí)現(xiàn)H5錄音功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【uniapp】使用permission獲取錄音權(quán)限及實(shí)現(xiàn)錄音功能

    【uniapp】使用permission獲取錄音權(quán)限及實(shí)現(xiàn)錄音功能

    需求 app獲取錄音權(quán)限權(quán)限, 實(shí)現(xiàn)錄音并且播放功能 實(shí)現(xiàn) 一. 使用permission獲取錄音權(quán)限 原博 : https://www.wanjunshijie.com/note/uniapp/3203.html 1.1 安卓 : manifest.json 配置權(quán)限 android.permission.RECORD_AUDIO **ios : manifest.json模塊配置 Record ** 1.2 permision使用和下載 ( 自行百度搜索即可 ) 1.3 獲取錄音

    2024年02月12日
    瀏覽(20)
  • Android 實(shí)現(xiàn)錄音功能

    通過媒體錄制器MediaRecorder實(shí)現(xiàn):MediaRecorder是Android自帶的音頻和視頻錄制工具,它通過操縱攝像頭和麥克風(fēng)完成媒體錄制,既可錄制視頻,又可單獨(dú)錄制音頻。 reset:重置錄制資源。 prepare:準(zhǔn)備錄制。 start:開始錄制。 stop:結(jié)束錄制。 release:釋放錄制資源。 setOnErrorList

    2024年02月12日
    瀏覽(12)
  • js前端實(shí)現(xiàn)語言識(shí)別(asr)與錄音

    js前端實(shí)現(xiàn)語言識(shí)別(asr)與錄音

    實(shí)習(xí)的時(shí)候,領(lǐng)導(dǎo)要求驗(yàn)證一下在web前端實(shí)現(xiàn)錄音和語音識(shí)別,查了一下發(fā)現(xiàn)網(wǎng)上有關(guān)語音識(shí)別也就是語音轉(zhuǎn)文字幾乎沒有任何教程。 其實(shí)有一種方案,前端先錄音然后把錄音傳到后端,后端在請(qǐng)求如百度語音轉(zhuǎn)文字的api進(jìn)行識(shí)別,但是這種就需要再寫個(gè)后端。如果直接前端

    2024年02月11日
    瀏覽(12)
  • vue3實(shí)現(xiàn)H5網(wǎng)頁錄音并上傳(mp3、wav)兼容Android、iOS和PC端

    使用 Recorder插件 可以在HTML5網(wǎng)頁中進(jìn)行錄音,錄音完成后得到blob文件對(duì)象,然后將blob上傳到服務(wù)器;項(xiàng)目使用的vue3.0版本(這個(gè)插件同時(shí)支持vue2.0、也支持uniapp,很強(qiáng)!?。?,錄音過程中會(huì)顯示可視化波形,同時(shí)能夠做到兼容PC端、Android、和iOS,一次編碼 到處運(yùn)行,哈哈

    2024年02月08日
    瀏覽(33)
  • Android錄音功能的實(shí)現(xiàn)及踩坑記錄

    最近接到個(gè)需求,不使用第三方SDK的情況下實(shí)現(xiàn)IM通訊,文字聊天已經(jīng)通過MQTT實(shí)現(xiàn),而語音功能目前想到的較好解決方案就是進(jìn)行錄音文件的上傳下載??赡苓€有更好解決方案,但我目前沒想到,有建議的小伙伴勞煩指導(dǎo)下。 前提 : 1、權(quán)限申請(qǐng): 清單文件中加上: 對(duì)應(yīng)讀

    2024年02月22日
    瀏覽(25)
  • Unity-WebGL基于JS實(shí)現(xiàn)網(wǎng)頁錄音

    ? ? ? 因?yàn)樵撍赖腢nity不支持WebGL的麥克風(fēng),所以只能向網(wǎng)頁借力,用網(wǎng)頁原生的navigator.getUserMedia錄音,然后傳音頻流給Unity進(jìn)行轉(zhuǎn)AudioClip播放。 ? ? ? 還有一點(diǎn)非常重要:能有同事借力就直接問,厚著臉皮上,我自己悶頭兩天帶加班,不如同事譚老哥加起來提供幫助的倆小

    2023年04月08日
    瀏覽(28)
  • Android中使用原生MediaRecorder APi實(shí)現(xiàn)錄音功能

    一、MediaRecorder簡介 MediaRecorder是Android中的一個(gè)API,可以用來實(shí)現(xiàn)錄音功能。它繼承自android.media.MediaRecorder類,可以實(shí)現(xiàn)音頻和視頻的錄制。 二、MediaRecorder的使用 1、首先,實(shí)例化一個(gè)MediaRecorder對(duì)象,并設(shè)置音頻源: 2、設(shè)置音頻的輸出格式: 3、設(shè)置音頻的編碼格式: 4、設(shè)

    2024年02月09日
    瀏覽(19)
  • HarmonyOS實(shí)戰(zhàn)開發(fā)-錄音機(jī)、如何實(shí)現(xiàn)音頻錄制和播放的功能

    HarmonyOS實(shí)戰(zhàn)開發(fā)-錄音機(jī)、如何實(shí)現(xiàn)音頻錄制和播放的功能

    本示例使用audio相關(guān)接口實(shí)現(xiàn)音頻錄制和播放的功能,使用mediaLibrary實(shí)現(xiàn)音頻文件的管理。 相關(guān)概念: AudioRecorder:音頻錄制的主要工作是捕獲音頻信號(hào),完成音頻編碼并保存到文件中,幫助開發(fā)者輕松實(shí)現(xiàn)音頻錄制功能。它允許調(diào)用者指定音頻錄制的采樣率、聲道數(shù)、編碼

    2024年04月17日
    瀏覽(92)
  • element-ui實(shí)現(xiàn)日期選擇器最近一周,上一周,下一周功能
  • js實(shí)現(xiàn)H5網(wǎng)頁飄窗

    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\\\"關(guān)于xxx的通知/a /div ? js代碼 ? script $(function() { var content = \\\'div style=\\\"margin-left: 20px;margin-right: 20px

    2023年04月27日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包