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

首頁 > 編程 > HTML > 正文

詳解HTML5 錄音的踩坑之旅

2024-08-26 00:20:13
字體:
供稿:網(wǎng)友

開篇閑扯

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

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

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

錄音前的準備

開始錄音前,要先獲取當前設(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_NUM);sourceNode.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://developer.mozilla.org/zh-CN/docs/Web/API/AnalyserNode/frequencyBinCount

其它

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

結(jié)語

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到HTML教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
成年人视频在线免费| jizz免费观看| 欧美亚洲一区二区在线观看| 亚洲成人一区在线| 久久久高清视频| 欧美黑人巨大videos精品| 成人午夜短视频| 成人在线激情网| 一二三四社区在线视频6| 久久久久久久久久久免费| 白嫩亚洲一区二区三区| 影音四色91| 亚洲人成在线播放网站岛国| 国产精品一区二区免费福利视频| 激情不卡一区二区三区视频在线| 少妇性l交大片| 国产在线无码精品| 超碰97在线人人| 婷婷六月综合网| 久久久精品久久久久特色影视| 欧美在线中文字幕高清的| 欧美日韩国产综合视频在线观看中文| 欧美日韩一级二级三级| 69国产成人精品视频软件| 亚洲欧美色视频| 在线观看视频一区二区| 亚洲综合伊人| 中文字幕在线视频不卡| 亚洲日本久久久| 久久精品亚洲7777影院| 亚欧视频在线观看| 国产精品自拍毛片| 午夜剧场在线免费观看| 午夜性爽视频男人的天堂| 午夜精品久久久久久久蜜桃app| 国产精品论坛| 神马久久精品| 久久婷婷一区二区| 欧美影视一区| 羞羞视频网站| 精品一区二区三区免费毛片爱| 日韩在线观看精品| 欧美日韩一级二级三级| 中文字幕人成高清视频| 日韩欧美国产电影| 99精品国产高清一区二区| 欧美日本一区二区三区| 一区二区三区入口| 亚洲精品久久久久中文字幕二区| 香蕉视频一区二区三区| 亚洲欧美国产77777| 欧美激情国产在线| 欧美成人vps| 亚洲在线视频观看| 麻豆国产入口在线观看免费| 精品少妇人妻av一区二区三区| 欧美成人免费高清视频| av一区在线观看| 日韩精品一区二区三区三区免费| 九九热精品视频国产| 日韩美女在线视频| 国产一区二区在线观看视频| 精品国产乱码久久久久久鸭王1| 亚洲精品一区二区三区福利| 亚洲精品乱码久久久久久久久| 中文在线字幕av| a视频网址在线观看| 激情五月婷婷小说| 蜜臀久久99精品久久久画质超高清| 双性尿奴穿贞c带憋尿| 中文国语毛片高清视频| 欧美丰满少妇xxxxx高潮对白| 亚洲一区二区在线免费观看视频| 国产欧美一区二区三区在线观看视频| 国产精品视频久久久| 天天做夜夜爱爱爱| 明星裸体视频一区二区| 免费又黄又爽又猛大片午夜| 91视频观看免费| 99在线热播精品免费| 精品国产a一区二区三区v免费| av无码精品一区二区三区| 国产夫妻在线观看| 亚洲一区二区中文在线| 欧美成人777| 少妇无套高潮一二三区| 亚洲免费视频二区| 国产免费视频传媒| 九九久久精品| 欧美黑人一级爽快片淫片高清| 亚洲美女少妇撒尿| 一区中文字幕电影| 精品少妇theporn| 9.1在线观看免费| 欧美亚洲国产一卡| 四虎影视2018在线播放alocalhost| 欧美日韩国产限制| 蜜桃传媒视频第一区入口在线看| 四虎永久免费地址| www.色小姐com| 欧美一区二区三区久久精品茉莉花| 国产网友自拍视频| 国产片在线观看| 国产欧美一区二区三区精品酒店| 91网站视频在线观看| 国产麻豆精品在线观看| 欧美精品一区二区三区四区五区| 娇小11一12╳yⅹ╳毛片| 好男人在线视频www| 成人性生交大片免费看视频在线| 亚洲一线二线三线久久久| 疯狂蹂躏欧美一区二区精品| 亚洲一区中文字幕永久在线| 欧美在线不卡区| 天天综合色天天综合| 婷婷激情四射网| 97久久精品人人做人人爽50路| 91chinesevideo永久地址| 美女黄色片视频| 夜夜嗨av一区二区三区中文字幕| 久久精品日产第一区二区三区| 一区二区三区四区视频| 日韩亚洲精品在线观看| 欧美高清一级片在线观看| 久久先锋影音av鲁色资源网| 亚洲第一欧美| 国产三级按摩推拿按摩| 欧美日韩一区二区三区视视频| 高潮无码精品色欲av午夜福利| 中文字幕永久在线不卡| 你懂的网站在线| 在线国产视频观看| 999精品视频在线观看| 国产目拍亚洲精品99久久精品| 色噜噜一区二区三区| 中文字幕在线播放不卡一区| 久久亚洲欧美国产精品乐播| 色伦专区97中文字幕| 伊人久久成人| 五月激情婷婷在线| 中文字幕亚洲在线| 自拍偷拍一区| 国产精彩免费视频| 91激情视频在线观看| 久久99国产精品99久久| 中文字幕在线观看高清| 毛片在线网址播放| av中文字幕亚洲| 亚洲999一在线观看www| wwwwxxxx日韩| 尤物yw193can在线观看| 日本黄色一区二区三区| 精品国产二区在线| 精品视频在线视频| 影音先锋亚洲视频| 最新天堂资源在线| 精品一区免费av| 国产综合成人久久大片91| 国产一级免费黄色片| 久久久99免费| 色综合久久影院| 国产成人精选| 51国产成人精品午夜福中文下载| 国产高清不卡av| 日韩大尺度视频| 久久影院电视剧免费观看| 久久人人爽人人爽人人| 欧美成人免费小视频| 久草国产在线视频| 亚洲精品无码专区| 欧美亚洲高清一区二区三区不卡| 国产精品一区二区羞羞答答| 国产精品资源| 中文字幕国产传媒| **欧美日韩vr在线| 国产精品乱码一区二区三区| 最近的中文字幕在线看视频| 欧美男女性生活在线直播观看| 男人天堂avav| 久久99999| 中文字幕一区二区三区日韩精品| 国产精品a久久久久| 成人欧美一区二区三区在线播放| 日本一区二区三区www| 美国一级黄色录像| 丝袜美腿美女被狂躁在线观看| 久久一二三四区| 亚洲一区日韩精品中文字幕| 久久99国产精品久久99小说| 亚洲高清视频中文字幕| 欧美va亚洲va香蕉在线| 男人天堂2017| 99精品桃花视频在线观看| 欧美日韩国产美| 男人c女人视频| 中文在线观看免费高清| 亚洲美女在线看| 亚洲另类图片另类电影| 国产激情第一页| 欧美极品少妇全裸体| 5566先锋影音夜色资源站在线观看| 亚洲一区二区三区精品中文字幕| 亚洲黄色小说图片| 九色在线观看| 国产一区二区在线免费| 中文字幕中文字幕中文字幕亚洲无线| 中文字幕在线观看不卡视频| 欧美日韩在线一| 国产又粗又硬又长又爽| 国产视频你懂的| av女人的天堂| 性xx无遮挡| 日本网站在线免费观看| 亚洲一区二区三区加勒比| 成人午夜精品一区二区三区| 久久精品久久综合| 日本人视频jizz页码69| 久久久亚洲精品视频| 亚洲av无日韩毛片久久| 国产自产2019最新不卡| 微拍福利一区二区| 国产成人激情小视频| ...中文天堂在线一区| 久久男人资源站| 日本不卡一区二区三区在线观看| 欧美激情在线一区二区三区| 懂色av中文一区二区三区天美| 国产精品一区二区av交换| 91av免费观看91av精品在线| 免费在线观看黄色网| 亚洲成aⅴ人片久久青草影院| 成人免费视频91| youjizzjizz亚洲| 欧美做受高潮中文字幕| 高清精品xnxxcom| 日韩一二三区不卡在线视频| 国产女人18水真多18精品一级做| 精品日产乱码久久久久久仙踪林| 欧美日韩人妻精品一区在线| 成人无号精品一区二区三区| 亚洲一区二区三区免费看| 日本中文字幕伦在线观看| 奇米四色中文综合久久| 亚洲综合精品久久| 男人天堂综合网| 老司机深夜福利网站| 国内精品嫩模av私拍在线观看| 久久久综合九色合综国产精品| 国产精品国产三级国产aⅴ浪潮| 亚洲成人福利在线| 中国一级特黄毛片大片| 亚洲成人av在线影院| 亚洲精品xxxxx| 久久精品视频日本| 亚洲欧美日韩小说| 国产a免费视频| 欧美mv和日韩mv的网站| 欧美极品jizzhd欧美仙踪林| 色婷婷国产精品免| 被男人吃奶添下面好舒服动态图| 欧美日韩国产免费| 国内小视频在线看| 丝袜亚洲精品中文字幕一区| 日本不卡视频一区二区| av在线亚洲色图| 欧美性猛交久久久乱大交小说| 亚洲一区二区在线播放| 精品国产999久久久免费| 亚洲一级不卡视频| 日韩欧美一二三区| 26uuu另类亚洲欧美日本老年| 日本黄色三级大片| 国产精品20p| 国产在线视频欧美一区二区三区| 老司机av网站| 福利地址发布页| 久久久久久久| av日韩在线网站| 四虎永久免费观看| 国产精品乱码一区二区三区视频| 在线观看中文字幕的网站| 日韩免费一区二区三区| 中文字幕电影在线观看| 日韩av毛片| 亚洲欧美网站| 精品资源在线看| 7777精品久久久大香线蕉小说| 天堂资源中文在线| 欧美手机视频| 国产精品对白刺激久久久| 国产美女直播视频一区| 国产精品冒白浆免费视频| 黄色成人在线免费观看| 国产精品wwww| 亚洲第一福利专区| yw.139尤物在线精品视频| 伊人久久大香线蕉成人综合网| 成人h版在线观看| 97影院在线午夜| 一本大道伊人av久久综合| 国户精品久久久久久久久久久不卡| 中文成人综合网| 九色网友自拍视频手机在线| 嫩草影院懂你的影院| 欧美aaaaaaaaaaaa| 性欧美视频videos6一9| 91在线国产观看| 日韩成人在线观看| 亚洲xxxx18| 免费大秀视频在线播放| 欧美激情视频一区二区三区免费| 爱情岛论坛亚洲首页入口章节| 麻豆av福利av久久av| 久久精品亚洲人成影院| 国产一区二区三区三区在线观看| 久久黄色影视| 美女禁区视频免费观看精选| 国产精品自在| 中文字幕国产日韩| 国产精品成人aaaaa网站| 国产wwwwxxxx| 欧美日一区二区三区在线观看国产免| 91香蕉视频免费在线观看| 中文字幕一区二区三区人妻| 国际精品欧美精品| 四虎8848精品成人免费网站| 成人久久久精品国产乱码一区二区| 国产乱码精品一区二区三区四区|