最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

微信開(kāi)發(fā)之微信jssdk錄音功能開(kāi)發(fā)示例

 更新時(shí)間:2018年10月22日 14:25:27   作者:豬豬豬惠婷  
這篇文章主要介紹了微信開(kāi)發(fā)之微信jssdk錄音功能開(kāi)發(fā)示例,在微信瀏覽器內(nèi)打開(kāi)的頁(yè)面,制作一個(gè)按鈕,用戶按住按鈕后開(kāi)始錄音,松手后停止錄音,感興趣的小伙伴們可以參考一下

項(xiàng)目需求簡(jiǎn)單描述

用戶長(zhǎng)按錄音,松手后直接結(jié)束錄音,結(jié)束錄音后,用戶可以選擇重新錄音、播放剛才的錄音,上傳錄音(這里的上傳錄音指上傳到自己服務(wù)器,上傳步驟是,前端調(diào)用wx.uploadVoice,后臺(tái)再到微信服務(wù)器下載音頻文件,上傳到自己的服務(wù)器)。注意,音頻文件自上傳時(shí)間算起在微信服務(wù)器的有效期為3天。由于后臺(tái)從微信服務(wù)器下載的音頻文件是amr格式的,需要后臺(tái)先把a(bǔ)mr文件轉(zhuǎn)換成MP3,前端用audio播放。我們公司是購(gòu)買阿里云的媒體處理服務(wù)進(jìn)行文件轉(zhuǎn)碼的。

調(diào)用到的微信接口

// 開(kāi)始錄音接口
wx.startRecord();

// 停止錄音接口
wx.stopRecord({
success: function (res) {
  var localId = res.localId;
 }
});

// 監(jiān)聽(tīng)錄音自動(dòng)停止接口
wx.onVoiceRecordEnd({
 // 錄音時(shí)間超過(guò)一分鐘沒(méi)有停止的時(shí)候會(huì)執(zhí)行 complete 回調(diào)
 complete: function (res) {
  var localId = res.localId;
 }
});

// 播放語(yǔ)音接口
wx.playVoice({
 localId: '' // 需要播放的音頻的本地ID,由stopRecord接口獲得
});

// 暫停播放接口
wx.pauseVoice({
 localId: '' // 需要暫停的音頻的本地ID,由stopRecord接口獲得
});

// 監(jiān)聽(tīng)語(yǔ)音播放完畢接口
wx.onVoicePlayEnd({wx.onVoice
 success: function (res) {
  var localId = res.localId; // 返回音頻的本地ID
 }
});

// 上傳語(yǔ)音接口
wx.uploadVoice({
 localId: '', // 需要上傳的音頻的本地ID,由stopRecord接口獲得
 isShowProgressTips: 1, // 默認(rèn)為1,顯示進(jìn)度提示
 success: function (res) {
  var serverId = res.serverId; // 返回音頻的服務(wù)器端ID
 }
});

主要涉及的知識(shí)點(diǎn)

//項(xiàng)目用到的框架:vue.js
@touchstart // 手指觸碰屏幕,開(kāi)始長(zhǎng)按
@touchend //手指離開(kāi)屏幕,結(jié)束長(zhǎng)按
@touchmove //手指在屏幕上滑動(dòng)

開(kāi)發(fā)流程

說(shuō)明:項(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 事件,換句話來(lái)說(shuō),就是手指觸碰屏幕時(shí)觸發(fā),所以這里監(jiān)聽(tīng)開(kāi)始長(zhǎng)按。

@touchend事件:當(dāng)手指從屏幕上離開(kāi)的時(shí)候觸發(fā),這里今天長(zhǎng)按結(jié)束。

@touchmove事件:當(dāng)手指在屏幕上滑動(dòng)的時(shí)候連續(xù)地觸發(fā)。在這個(gè)長(zhǎng)按錄音的場(chǎng)景中,當(dāng)手指在屏幕上移動(dòng)了,也視為錄音結(jié)束,所以要監(jiān)聽(tīng)手指在屏幕上滑動(dòng)。

3.js代碼

methods:{
 gtouchstart(){
  // 當(dāng)用戶長(zhǎng)按500ms以上再真正開(kāi)始錄音
  setTimeout(() => {
   this.longPress()
  }, 500)}
 },
 longPress(){
  wx.startRecord() // 微信開(kāi)始錄音接口
 },
 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
   }
  });
 },
}

大致過(guò)程如上面代碼所示:

  • 在某個(gè)html元素監(jiān)聽(tīng)開(kāi)始長(zhǎng)按事件、結(jié)束長(zhǎng)按事件、在屏幕上移動(dòng)事件;
  • 長(zhǎng)按事件開(kāi)始,這時(shí)調(diào)用微信接口wx.startRecord開(kāi)始錄音;
  • 長(zhǎng)按事件結(jié)束,這時(shí)調(diào)用微信接口wx.stopRecord結(jié)束錄音,得到音頻的localId;
  • 當(dāng)用戶在長(zhǎng)按過(guò)程中手指移動(dòng)了,也調(diào)用wx.stopRecord結(jié)束錄音;
  • 錄音結(jié)束后,調(diào)用微信接口wx.uploadVoice把音頻上傳到微信服務(wù)器。

開(kāi)發(fā)過(guò)程遇到的問(wèn)題

1.調(diào)用微信錄音超過(guò)60秒時(shí),微信會(huì)自動(dòng)結(jié)束錄音并且返回一個(gè)localId,并且這個(gè)localId是無(wú)效的

解決方案:

在 wx.startRecord() 開(kāi)始之前添加定時(shí)器,如果錄音時(shí)間到達(dá)59秒,執(zhí)行wx.stopRecord主動(dòng)停止錄音,避免用戶錄音時(shí)間過(guò)長(zhǎng)導(dǎo)致錄音無(wú)效。

2.微信錄音功能授權(quán)引發(fā)的交互問(wèn)題

使用微信jssdk接口錄音,在同一個(gè)域只需要授權(quán)一次,即第一次使用錄音的時(shí)候,微信自己會(huì)彈出對(duì)話框詢問(wèn)是否允許錄音,用戶點(diǎn)擊允許后,之后再使用錄音時(shí),便不會(huì)再咨詢用戶是否允許。

在第一次按住錄音后,由于用戶未曾允許錄音,微信會(huì)提示用戶授權(quán)允許在本頁(yè)面使用微信錄音功能,這時(shí)用戶會(huì)放開(kāi)錄音按鈕轉(zhuǎn)而去點(diǎn)擊允許,在用戶允許后,才真正會(huì)開(kāi)始錄音,而此時(shí)用戶早已放開(kāi)錄音按鈕,那么錄音按鈕上便不會(huì)再有touchend事件,錄音便會(huì)一直進(jìn)行。

解決策略:使用localStorage記錄用戶是否曾授權(quán),并以此來(lái)判斷是否需要在剛進(jìn)入頁(yè)面是自動(dòng)錄一段錄音來(lái)觸發(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下不能自動(dòng)播放audio的問(wèn)題

關(guān)于音頻的播放,為了頁(yè)面美觀,處理方式是隱藏audio的播放控件,然后給一個(gè)按鈕添加時(shí)間,通過(guò)audio.play()來(lái)控制音頻的播放的。但是在ios下有個(gè)問(wèn)題,audio.play()是不能直接播放音頻的,只能顯式地通過(guò)操作音頻的播放控件來(lái)。這是因?yàn)閕OS Safari 不允許自動(dòng)播放 audio,只能通過(guò)用戶交互觸發(fā)。這大概是蘋(píng)果公司出于用戶體驗(yàn)而做的限制。

解決方案:

// 在頁(yè)面初始化成功后,在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();
 })
})

4.終極問(wèn)題:某些手機(jī)屏幕不靈敏導(dǎo)致長(zhǎng)按錄音出現(xiàn)各種各樣的問(wèn)題

描述:在初次完成長(zhǎng)按錄音的功能后,我在公司多臺(tái)貼了膜或者屏幕摔爛的手機(jī)測(cè)試發(fā)現(xiàn),這些手機(jī)長(zhǎng)按、和取消長(zhǎng)按的事件相當(dāng)不靈敏,誤差很大,有時(shí)莫名其秒地結(jié)束錄音,體驗(yàn)非常差。

解決方案:我們和產(chǎn)品經(jīng)過(guò)商量,擺出這個(gè)避免不了的問(wèn)題,最終把長(zhǎng)按錄音的交互模式改成了點(diǎn)擊錄音。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JS獲取下拉列表所選中的TEXT和Value的實(shí)現(xiàn)代碼

    JS獲取下拉列表所選中的TEXT和Value的實(shí)現(xiàn)代碼

    本篇文章主要是對(duì)JS獲取下拉列表所選中的TEXT和Value的實(shí)現(xiàn)代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-01-01
  • npm qs模塊使用詳解

    npm qs模塊使用詳解

    這篇文章主要介紹了npm qs模塊使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • JavaScript Array Flatten 與遞歸使用介紹

    JavaScript Array Flatten 與遞歸使用介紹

    用 JavaScript 將 [1,2,3,[4,5, [6,7]], [[[8]]]] 這樣一個(gè) Array 變成 [1,2,3,4,5, 6,7,8] 呢?傳說(shuō)中的 Array Flatten
    2011-10-10
  • Javascript日期時(shí)間函數(shù)的使用方法舉例

    Javascript日期時(shí)間函數(shù)的使用方法舉例

    在JavaScript中日期時(shí)間函數(shù)是一組用于操作和處理日期和時(shí)間的函數(shù),這些函數(shù)可以用于獲取當(dāng)前日期和時(shí)間、格式化日期和時(shí)間、計(jì)算日期和時(shí)間的差異、轉(zhuǎn)換日期和時(shí)間的格式等,這篇文章主要給大家介紹了關(guān)于Javascript日期時(shí)間函數(shù)的使用方法,需要的朋友可以參考下
    2024-02-02
  • javacript replace 正則取字符串中的值并替換【推薦】

    javacript replace 正則取字符串中的值并替換【推薦】

    replace() 方法用于在字符串中用一些字符替換另一些字符,或替換一個(gè)與正則表達(dá)式匹配的子串。這篇文章主要介紹了javacript replace 正則取字符串中的值并替換,需要的朋友可以參考下
    2018-09-09
  • 對(duì)Layer彈窗使用及返回?cái)?shù)據(jù)接收的實(shí)例詳解

    對(duì)Layer彈窗使用及返回?cái)?shù)據(jù)接收的實(shí)例詳解

    今天小編就為大家分享一篇對(duì)Layer彈窗使用及返回?cái)?shù)據(jù)接收的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • javascript中的delete使用詳解

    javascript中的delete使用詳解

    在這篇文章中作者從《JavaScript面向?qū)ο缶幊讨改稀芬粫?shū)中關(guān)于 delete 的錯(cuò)誤講起,詳細(xì)講述了關(guān)于 delete 操作的實(shí)現(xiàn), 局限以及在不同瀏覽器和插件(這里指 firebug)中的表現(xiàn)
    2013-04-04
  • webpack4.x開(kāi)發(fā)環(huán)境配置詳解

    webpack4.x開(kāi)發(fā)環(huán)境配置詳解

    這篇文章主要介紹了webpack4.x開(kāi)發(fā)環(huán)境配置方法,結(jié)合實(shí)例形式詳細(xì)分析了webpack4.x的具體安裝、項(xiàng)目創(chuàng)建、打包操作等相關(guān)問(wèn)題與處理技巧,需要的朋友可以參考下
    2018-08-08
  • js實(shí)現(xiàn)簡(jiǎn)單放大鏡特效

    js實(shí)現(xiàn)簡(jiǎn)單放大鏡特效

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)單放大鏡特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • javascript 上下banner替換具體實(shí)現(xiàn)

    javascript 上下banner替換具體實(shí)現(xiàn)

    這篇文章介紹了javascript 上下banner替換具體實(shí)現(xiàn),有需要的朋友可以參考一下
    2013-11-11

最新評(píng)論

遂宁市| 囊谦县| 宁海县| 蕲春县| 五家渠市| 长沙县| 恭城| 深泽县| 桃园县| 盐源县| 英德市| 陆丰市| 丘北县| 同心县| 邵阳市| 高邑县| 公安县| 镇平县| 康平县| 丘北县| 龙南县| 伽师县| 松原市| 佛冈县| 河北区| 博爱县| 北票市| 洞口县| 于都县| 南木林县| 炎陵县| 西贡区| 上饶市| 五家渠市| 安义县| 山东| 丽水市| 涪陵区| 兰州市| 建瓯市| 青州市|