国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > HTML > 正文

詳解HTML5 錄音遇到的坑

2020-03-24 16:07:18
字體:
供稿:網(wǎng)友
本文恩主要介紹了詳解HTML5 錄音的踩坑之旅,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能幫助到大家。

說實話,一開始都沒接觸過 HTML5 的 Audio API,而且要基于在我們接手前的代碼中進行優(yōu)化。當然其中也踩了不少坑,這次也會圍繞這幾個坑來說說感受(會省略一些基本對象的初始化和獲取,因為這些內(nèi)容不是這次的重點,有興趣的同學可以自行查找 MDN 上的文檔):

調(diào)用 Audio API 的兼容寫法

獲取錄音聲音的大?。☉撌穷l率)

暫停錄音的兼容性寫法

獲取當前錄音時間

錄音前的準備

開始錄音前,要先獲取當前設(shè)備是否支持 Audio API。早期的方法 navigator.getUserMedia 已經(jīng)被 navigator.mediaDevices.getUserMedia 所代替。正常來說現(xiàn)在大部分的現(xiàn)代瀏覽器都已經(jīng)支持 navigator.mediaDevices.getUserMedia 的用法了,當然 MDN 上也給出了兼容性的寫法

const promisifiedOldGUM = function(constraints) { // First get ahold of getUserMedia, if present const getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; // Some browsers just don t implement it - return a rejected promise with an error // to keep a consistent interface if (!getUserMedia) { return Promise.reject( new Error( getUserMedia is not implemented in this browser ) // Otherwise, wrap the call to the old navigator.getUserMedia with a Promise return new Promise(function(resolve, reject) { getUserMedia.call(navigator, constraints, resolve, reject);// Older browsers might not implement mediaDevices at all, so we set an empty object firstif (navigator.mediaDevices === undefined) { navigator.mediaDevices = {};// Some browsers partially implement mediaDevices. We can t just assign an object// with getUserMedia as it would overwrite existing properties.// Here, we will just add the getUserMedia property if it s missing.if (navigator.mediaDevices.getUserMedia === undefined) { navigator.mediaDevices.getUserMedia = promisifiedOldGUM;}

因為這個方法是異步的,所以我們可以對無法兼容的設(shè)備進行友好的提示

navigator.mediaDevices.getUserMedia(constraints).then( function(mediaStream) { // 成功 function(error) { // 失敗 const { name } = error; let errorMessage; switch (name) { // 用戶拒絕 case NotAllowedError : case PermissionDeniedError : errorMessage = 用戶已禁止網(wǎng)頁調(diào)用錄音設(shè)備  break; // 沒接入錄音設(shè)備 case NotFoundError : case DevicesNotFoundError : errorMessage = 錄音設(shè)備未找到  break; // 其它錯誤 case NotSupportedError : errorMessage = 不支持錄音功能  break; default: errorMessage = 錄音調(diào)用錯誤  window.console.log(error); return errorMessage;);

一切順利的話,我們就可以進入下一步了。

(這里有對獲取上下文的方法進行了省略,因為這不是這次的重點)

開始錄音、暫停錄音

這里有個比較特別的點,就是需要添加一個中間變量來標識是否當前是否在錄音。因為在火狐瀏覽器上,我們發(fā)現(xiàn)一個問題,錄音的流程都是正常的,但是點擊暫停時卻發(fā)現(xiàn)怎么也暫停不了,我們當時是使用 disconnect 方法。這種方式是不行的,這種方法是需要斷開所有的連接才可以。后來發(fā)現(xiàn),應該增加一個中間變量 this.isRecording 來判斷當前是否正在錄音,當點擊開始時,將其設(shè)置為 true ,暫停時將其設(shè)置為 false 。

當我們開始錄音時,會有一個錄音監(jiān)聽的事件 onaudioprocess ,如果返回 true 則會將流寫入,如果返回 false 則不會將其寫入。因此判斷 this.isRecording ,如果為 false 則直接 return

// 一些初始化const audioContext = new AudioContext();const sourceNode = audioContext.createMediaStreamSource(mediaStream);const scriptNode = audioContext.createScriptProcessor( BUFFER_SIZE, INPUT_CHANNELS_NUM, OUPUT_CHANNELS_NUMsourceNode.connect(this.scriptNode);scriptNode.connect(this.audioContext.destination);// 監(jiān)聽錄音的過程scriptNode.onaudioprocess = event = { if (!this.isRecording) return; // 判斷是否正則錄音 this.buffers.push(event.inputBuffer.getChannelData(0)); // 獲取當前頻道的數(shù)據(jù),并寫入數(shù)組};

當然這里也會有個坑,就是無法再使用,自帶獲取當前錄音時長的方法了,因為實際上并不是真正的暫停,而是沒有將流寫入罷了。于是我們還需要獲取一下當前錄音的時長,需要通過一個公式進行獲取

const getDuration = () = { return (4096 * this.buffers.length) / this.audioContext.sampleRate // 4096為一個流的長度,sampleRate 為采樣率}

這樣就能夠獲取正確的錄音時長了。

結(jié)束錄音

結(jié)束錄音的方式,我采用的是先暫停,之后需要試聽或者其它的操作先執(zhí)行,然后再將存儲流的數(shù)組長度置為 0。

獲取頻率

getVoiceSize = analyser = { const dataArray = new Uint8Array(analyser.frequencyBinCount); analyser.getByteFrequencyData(dataArray); const data = dataArray.slice(100, 1000); const sum = data.reduce((a, b) = a + b); return sum;};

其它

HTTPS:在 chrome 下需要全站有 HTTPS 才允許使用

微信:在微信內(nèi)置的瀏覽器需要調(diào)用 JSSDK 才能使用

音頻格式轉(zhuǎn)換:音頻格式的方式也有很多了,能查到的大部分資料,大家基本上是互相 copy,當然還有一個音頻質(zhì)量的問題,這里就不贅述了。

結(jié)語

這次遇到的大部分問題都是兼容性的問題,因此在上面踩了不少坑,尤其是移動端的問題,一開始還有出現(xiàn)因為獲取錄音時長寫法錯誤的問題,導致直接卡死的情況。這次的經(jīng)歷也彌補了 HTML5 API 上的一些空白,當然最重要的還是要提醒一下大家,這種原生的 API 文檔還是直接查看 MDN 來的簡單粗暴!

相關(guān)推薦:

關(guān)于錄音的10篇文章推薦

微信開發(fā)之錄音功能

詳解HTML5網(wǎng)頁錄音和壓縮的示例代碼

以上就是詳解HTML5 錄音遇到的坑的詳細內(nèi)容,其它編程語言

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 轮台县| 公主岭市| 沿河| 马公市| 望谟县| 台州市| 平泉县| 禄丰县| 高阳县| 湖口县| 江口县| 三台县| 广南县| 定结县| 饶平县| 新源县| 金沙县| 大宁县| 台东县| 蒲江县| 定州市| 维西| 许昌市| 台南市| 荥阳市| 织金县| 丹凤县| 汾阳市| 鄯善县| 淮阳县| 勐海县| 台州市| 岳普湖县| 特克斯县| 景德镇市| 县级市| 略阳县| 哈密市| 长治县| 北川| 岢岚县|