亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > HTML5 > 正文

詳解HTML5 錄音的踩坑之旅

2024-09-05 07:22:15
字體:
來源:轉載
供稿:網友

開篇閑扯

前一段時間的一個案子是開發一個有聲課件,大致就是通過導入文檔、圖片等資源后,頁面變為類似 PPT 的布局,然后選中一張圖片,可以插入音頻,有單頁編輯和全局編輯兩種模式。其中音頻的導入方式有兩種,一種是從資源庫中導入,還有一種就是要提到的錄音。

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

  1. 調用 Audio API 的兼容性寫法
  2. 獲取錄音聲音的大小(應該是頻率)
  3. 暫停錄音的兼容性寫法
  4. 獲取當前錄音時間

錄音前的準備

開始錄音前,要先獲取當前設備是否支持 Audio API。早期的方法 navigator.getUserMedia 已經被 navigator.mediaDevices.getUserMedia 所代替。正常來說現在大部分的現代瀏覽器都已經支持 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;}

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

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

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

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

開始錄音、暫停錄音

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

當我們開始錄音時,會有一個錄音監聽的事件 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_NUM);sourceNode.connect(this.scriptNode);scriptNode.connect(this.audioContext.destination);// 監聽錄音的過程scriptNode.onaudioprocess = event => { if (!this.isRecording) return; // 判斷是否正則錄音 this.buffers.push(event.inputBuffer.getChannelData(0)); // 獲取當前頻道的數據,并寫入數組};

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

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

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

結束錄音

結束錄音的方式,我采用的是先暫停,之后需要試聽或者其它的操作先執行,然后再將存儲流的數組長度置為 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://developer.mozilla.org/zh-CN/docs/Web/API/AnalyserNode/frequencyBinCount

其它

  1. HTTPS:在 chrome 下需要全站有 HTTPS 才允許使用
  2. 微信:在微信內置的瀏覽器需要調用 JSSDK 才能使用
  3. 音頻格式轉換:音頻格式的方式也有很多了,能查到的大部分資料,大家基本上是互相 copy,當然還有一個音頻質量的問題,這里就不贅述了。

結語

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近2019中文字幕在线高清| 欧美激情视频在线免费观看 欧美视频免费一| 两个人的视频www国产精品| 欧美成人精品一区二区三区| 亚洲精品久久7777777| 欧美日韩在线看| 亚洲精品久久久久国产| 日韩在线观看高清| 欧美—级a级欧美特级ar全黄| 欧美一级大片在线免费观看| 久久精品青青大伊人av| 国产精品丝袜久久久久久不卡| 日韩一区二区av| 亚洲最大在线视频| 久久天天躁狠狠躁老女人| 日韩欧美一区二区三区久久| 欧美最顶级丰满的aⅴ艳星| 亚洲网站在线观看| 亚洲欧美国产一本综合首页| 国产精品视频一区二区三区四| 欧美激情亚洲国产| 亚洲国产精品人久久电影| 亚洲色图35p| 亲子乱一区二区三区电影| 久久久久久久国产| 亚洲欧美国产日韩天堂区| 亚洲欧洲日产国码av系列天堂| 亚洲精品第一国产综合精品| 亚洲自拍高清视频网站| 91美女片黄在线观| 欧美性黄网官网| 久久综合网hezyo| 久久久久久18| 亚洲精品欧美日韩专区| 午夜剧场成人观在线视频免费观看| 欧美性受xxxx黑人猛交| 国产精品麻豆va在线播放| 亚洲小视频在线| 国产性猛交xxxx免费看久久| 久久精品福利视频| 中文字幕久久亚洲| 久久91亚洲精品中文字幕奶水| 黑人巨大精品欧美一区二区一视频| 欧美精品video| 亚洲电影天堂av| 日韩成人在线视频观看| 欧美激情一二三| 国产91免费看片| 国产亚洲精品成人av久久ww| 亚洲精品短视频| 亚洲自拍偷拍一区| 日本精品一区二区三区在线播放视频| 91精品在线播放| 欧美资源在线观看| 日韩在线免费观看视频| 亚洲精品国产电影| 国产精品精品久久久久久| 九九热精品视频| 91精品久久久久久久久久入口| 欧美高跟鞋交xxxxxhd| 亚洲精品久久久久久久久| 亚洲精品自产拍| 国产精品久久久久久久久久新婚| 久久夜色撩人精品| 久久久久九九九九| 亚洲人成网站777色婷婷| 92国产精品久久久久首页| 日韩中文字幕视频| 亚洲自拍在线观看| 欧美在线播放视频| 亚洲欧洲日韩国产| 亚洲第一中文字幕| 亚洲天堂av网| 激情成人中文字幕| 亚洲精品一区二区三区婷婷月| 在线电影av不卡网址| 亚洲免费视频在线观看| 欧美在线观看日本一区| 秋霞av国产精品一区| 久久久999精品| 久久99精品国产99久久6尤物| 国内免费久久久久久久久久久| 最近2019中文字幕一页二页| 97人洗澡人人免费公开视频碰碰碰| 亚洲精品短视频| 美女999久久久精品视频| 欧美激情视频网址| 久久艹在线视频| 国产亚洲一区二区在线| 欧美亚洲在线播放| 精品偷拍一区二区三区在线看| 国产91精品在线播放| 亚洲美女喷白浆| 亚洲激情视频网| 精品激情国产视频| 在线看日韩欧美| 欧美一级片在线播放| 久久成人av网站| 国产欧美一区二区三区在线| 国产成人精品在线| 91久久久久久久久久久久久| 国产精品视频99| 欧美极品xxxx| 亚洲欧美日韩爽爽影院| 国产亚洲精品久久久久久| 最近2019年日本中文免费字幕| 亚洲第一黄色网| 国产精品爱啪在线线免费观看| 久久亚洲国产精品成人av秋霞| 久久久久久久久久久国产| 亚洲男人天堂2024| 欧美成年人视频网站| 97视频在线免费观看| 91精品国产91久久久久久吃药| 久久精品色欧美aⅴ一区二区| 5278欧美一区二区三区| 亚洲少妇激情视频| 精品日本高清在线播放| 欧美色视频日本版| 92国产精品久久久久首页| 国内精品国产三级国产在线专| 久久在线免费视频| 日韩欧美在线免费观看| 亚洲男女自偷自拍图片另类| 亚洲精品免费在线视频| 日韩国产在线看| 91av在线国产| 九九热精品视频在线播放| 日韩欧美综合在线视频| 中文字幕av一区中文字幕天堂| 亚洲精品之草原avav久久| 色老头一区二区三区在线观看| 欧美精品videosex性欧美| 国产剧情日韩欧美| 国产一区二区在线免费视频| 欧美视频中文字幕在线| 日韩av在线免播放器| 国产成人综合一区二区三区| 情事1991在线| 91影院在线免费观看视频| 国产精品一区二区av影院萌芽| 久久69精品久久久久久国产越南| 俺去了亚洲欧美日韩| 国产精品三级美女白浆呻吟| 国产精品成人一区| 亚洲欧美在线x视频| 精品国内自产拍在线观看| 欧美一级大片在线观看| 久久久久久久久久国产精品| 国产91在线高潮白浆在线观看| 91极品女神在线| 中文字幕无线精品亚洲乱码一区| 国语自产精品视频在线看抢先版图片| 亚洲第一视频在线观看| 久久高清视频免费| 欧洲成人在线观看| 亚洲高清不卡av| 精品福利樱桃av导航| 91精品免费久久久久久久久| 欧美日韩一区二区在线播放| 77777少妇光屁股久久一区| 欧洲亚洲免费在线| 亚洲电影免费观看高清完整版| 超碰91人人草人人干|