您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)怎么在微信中實(shí)現(xiàn)jssdk錄音功能,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
調(diào)用到的微信接口
// 開始錄音接口 wx.startRecord(); // 停止錄音接口 wx.stopRecord({ success: function (res) { var localId = res.localId; } }); // 監(jiān)聽錄音自動停止接口 wx.onVoiceRecordEnd({ // 錄音時(shí)間超過一分鐘沒有停止的時(shí)候會執(zhí)行 complete 回調(diào) complete: function (res) { var localId = res.localId; } }); // 播放語音接口 wx.playVoice({ localId: '' // 需要播放的音頻的本地ID,由stopRecord接口獲得 }); // 暫停播放接口 wx.pauseVoice({ localId: '' // 需要暫停的音頻的本地ID,由stopRecord接口獲得 }); // 監(jiān)聽語音播放完畢接口 wx.onVoicePlayEnd({wx.onVoice success: function (res) { var localId = res.localId; // 返回音頻的本地ID } }); // 上傳語音接口 wx.uploadVoice({ localId: '', // 需要上傳的音頻的本地ID,由stopRecord接口獲得 isShowProgressTips: 1, // 默認(rèn)為1,顯示進(jìn)度提示 success: function (res) { var serverId = res.serverId; // 返回音頻的服務(wù)器端ID } });
主要涉及的知識點(diǎn)
//項(xiàng)目用到的框架:vue.js @touchstart // 手指觸碰屏幕,開始長按 @touchend //手指離開屏幕,結(jié)束長按 @touchmove //手指在屏幕上滑動
開發(fā)流程
說明:項(xiàng)目用到的框架:Vue
1.引入微信jssdk,做好微信配置
2.HTML結(jié)構(gòu):
<div @touchstart="gtouchstart()" @touchend="gtouchend()" @touchmove="gtouchmove()"></div>
touchstart事件:MDN的定義是:當(dāng)觸點(diǎn)與觸控設(shè)備表面接觸時(shí)觸發(fā)touchstart 事件,換句話來說,就是手指觸碰屏幕時(shí)觸發(fā),所以這里監(jiān)聽開始長按。
@touchend事件:當(dāng)手指從屏幕上離開的時(shí)候觸發(fā),這里今天長按結(jié)束。
@touchmove事件:當(dāng)手指在屏幕上滑動的時(shí)候連續(xù)地觸發(fā)。在這個(gè)長按錄音的場景中,當(dāng)手指在屏幕上移動了,也視為錄音結(jié)束,所以要監(jiān)聽手指在屏幕上滑動。
3.js代碼
methods:{ gtouchstart(){ // 當(dāng)用戶長按500ms以上再真正開始錄音 setTimeout(() => { this.longPress() }, 500)} }, longPress(){ wx.startRecord() // 微信開始錄音接口 }, gtouchmove(){ wx.stopRecord({ // 微信結(jié)束錄音接口 success: res => { this.localId = res.localId; console.log('中斷結(jié)束錄音') } }) }, gtouchend(){ wx.stopRecord({ // 微信結(jié)束錄音接口 success: res => { this.localId = res.localId; console.log('正常結(jié)束錄音成功了') } }) }, wxUpload() { // 上傳到微信服務(wù)器 wx.uploadVoice({ localId: this.localId, // 需要上傳的音頻的本地ID,由stopRecord接口獲得 isShowProgressTips: 1, // 默認(rèn)為1,顯示進(jìn)度提示 success: res => { this.serverId = res.serverId; // 返回音頻的服務(wù)器端ID } }); }, }
大致過程如上面代碼所示:
在某個(gè)html元素監(jiān)聽開始長按事件、結(jié)束長按事件、在屏幕上移動事件;
長按事件開始,這時(shí)調(diào)用微信接口wx.startRecord開始錄音;
長按事件結(jié)束,這時(shí)調(diào)用微信接口wx.stopRecord結(jié)束錄音,得到音頻的localId;
當(dāng)用戶在長按過程中手指移動了,也調(diào)用wx.stopRecord結(jié)束錄音;
錄音結(jié)束后,調(diào)用微信接口wx.uploadVoice把音頻上傳到微信服務(wù)器。
開發(fā)過程遇到的問題
1.調(diào)用微信錄音超過60秒時(shí),微信會自動結(jié)束錄音并且返回一個(gè)localId,并且這個(gè)localId是無效的
解決方案:
在 wx.startRecord() 開始之前添加定時(shí)器,如果錄音時(shí)間到達(dá)59秒,執(zhí)行wx.stopRecord主動停止錄音,避免用戶錄音時(shí)間過長導(dǎo)致錄音無效。
2.微信錄音功能授權(quán)引發(fā)的交互問題
使用微信jssdk接口錄音,在同一個(gè)域只需要授權(quán)一次,即第一次使用錄音的時(shí)候,微信自己會彈出對話框詢問是否允許錄音,用戶點(diǎn)擊允許后,之后再使用錄音時(shí),便不會再咨詢用戶是否允許。
在第一次按住錄音后,由于用戶未曾允許錄音,微信會提示用戶授權(quán)允許在本頁面使用微信錄音功能,這時(shí)用戶會放開錄音按鈕轉(zhuǎn)而去點(diǎn)擊允許,在用戶允許后,才真正會開始錄音,而此時(shí)用戶早已放開錄音按鈕,那么錄音按鈕上便不會再有touchend事件,錄音便會一直進(jìn)行。
解決策略:使用localStorage記錄用戶是否曾授權(quán),并以此來判斷是否需要在剛進(jìn)入頁面是自動錄一段錄音來觸發(fā)用戶授權(quán)
if(!localStorage.rainAllowRecord || localStorage.rainAllowRecord !== 'true'){ wx.startRecord({ success: function(){ localStorage.rainAllowRecord = 'true'; wx.stopRecord(); }, cancel: function () { alert('用戶拒絕授權(quán)錄音'); } }); }
3.在ios下不能自動播放audio的問題
關(guān)于音頻的播放,為了頁面美觀,處理方式是隱藏audio的播放控件,然后給一個(gè)按鈕添加時(shí)間,通過audio.play()來控制音頻的播放的。但是在ios下有個(gè)問題,audio.play()是不能直接播放音頻的,只能顯式地通過操作音頻的播放控件來。這是因?yàn)閕OS Safari 不允許自動播放 audio,只能通過用戶交互觸發(fā)。這大概是蘋果公司出于用戶體驗(yàn)而做的限制。
解決方案:
// 在頁面初始化成功后,在wx.ready的回調(diào)函數(shù)內(nèi),收到執(zhí)行下面的方法,這樣ios用戶在點(diǎn)擊播放按鈕時(shí)就能正常播放音頻 wx.ready(() => { this.$nextTick(() => { this.$refs.audio.load() this.$refs.audio.play() this.$refs.audio.pause(); }) })
關(guān)于怎么在微信中實(shí)現(xiàn)jssdk錄音功能就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。