成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > 詳解HTML5 錄音的踩坑之旅

詳解HTML5 錄音的踩坑之旅

熱門標(biāo)簽:電銷機(jī)器人電話用什么卡 當(dāng)涂高德地圖標(biāo)注 南寧點(diǎn)撥外呼系統(tǒng)哪家公司做的好 云南大理400電話申請(qǐng)官方 四川點(diǎn)撥外呼系統(tǒng) 黃島區(qū)地圖標(biāo)注 鎮(zhèn)江智能外呼系統(tǒng)有效果嗎 成都智能外呼系統(tǒng)平臺(tái) 江蘇智能電銷機(jī)器人哪家好

開(kāi)篇閑扯

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

說(shuō)實(shí)話,一開(kāi)始都沒(méi)接觸過(guò) HTML5 的 Audio API,而且要基于在我們接手前的代碼中進(jìn)行優(yōu)化。當(dāng)然其中也踩了不少坑,這次也會(huì)圍繞這幾個(gè)坑來(lái)說(shuō)說(shuō)感受(會(huì)省略一些基本對(duì)象的初始化和獲取,因?yàn)檫@些內(nèi)容不是這次的重點(diǎn),有興趣的同學(xué)可以自行查找 MDN 上的文檔):

  1. 調(diào)用 Audio API 的兼容性寫法
  2. 獲取錄音聲音的大?。☉?yīng)該是頻率)
  3. 暫停錄音的兼容性寫法
  4. 獲取當(dāng)前錄音時(shí)間

錄音前的準(zhǔn)備

開(kāi)始錄音前,要先獲取當(dāng)前設(shè)備是否支持 Audio API。早期的方法 navigator.getUserMedia 已經(jīng)被 navigator.mediaDevices.getUserMedia 所代替。正常來(lái)說(shuō)現(xiàn)在大部分的現(xiàn)代瀏覽器都已經(jīng)支持 navigator.mediaDevices.getUserMedia 的用法了,當(dāng)然 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 first
if (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;
}

因?yàn)檫@個(gè)方法是異步的,所以我們可以對(duì)無(wú)法兼容的設(shè)備進(jìn)行友好的提示

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

一切順利的話,我們就可以進(jìn)入下一步了。

(這里有對(duì)獲取上下文的方法進(jìn)行了省略,因?yàn)檫@不是這次的重點(diǎn))

開(kāi)始錄音、暫停錄音

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

當(dāng)我們開(kāi)始錄音時(shí),會(huì)有一個(gè)錄音監(jiān)聽(tīng)的事件 onaudioprocess ,如果返回 true 則會(huì)將流寫入,如果返回 false 則不會(huì)將其寫入。因此判斷 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)聽(tīng)錄音的過(guò)程
scriptNode.onaudioprocess = event => {
 if (!this.isRecording) return; // 判斷是否正則錄音
 this.buffers.push(event.inputBuffer.getChannelData(0)); // 獲取當(dāng)前頻道的數(shù)據(jù),并寫入數(shù)組
};

當(dāng)然這里也會(huì)有個(gè)坑,就是無(wú)法再使用,自帶獲取當(dāng)前錄音時(shí)長(zhǎng)的方法了,因?yàn)閷?shí)際上并不是真正的暫停,而是沒(méi)有將流寫入罷了。于是我們還需要獲取一下當(dāng)前錄音的時(shí)長(zhǎng),需要通過(guò)一個(gè)公式進(jìn)行獲取

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

這樣就能夠獲取正確的錄音時(shí)長(zhǎng)了。

結(jié)束錄音

結(jié)束錄音的方式,我采用的是先暫停,之后需要試聽(tīng)或者其它的操作先執(zhí)行,然后再將存儲(chǔ)流的數(shù)組長(zhǎng)度置為 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,當(dāng)然還有一個(gè)音頻質(zhì)量的問(wèn)題,這里就不贅述了。

結(jié)語(yǔ)

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

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

標(biāo)簽:十堰 咸寧 佳木斯 酒泉 南京 淮安 廣西 西寧

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解HTML5 錄音的踩坑之旅》,本文關(guān)鍵詞  詳解,HTML5,錄音,的,踩坑,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解HTML5 錄音的踩坑之旅》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于詳解HTML5 錄音的踩坑之旅的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产色视频在线播放| 香蕉视频一区二区| 中文字幕一区二区三区四区五区| 欧美精品欧美精品系列c| 奇米精品一区二区三区在线观看| 国产免费一区视频观看免费| 国产中文字幕在线观看| 在线免费成人| 免费观看性欧美大片无片| 成人黄色视屏网站| 国产精品日日做人人爱| 色一区av在线| 精品一成人岛国片在线观看| 夜色资源站国产www在线视频| 别急慢慢来1978如如2| 亚洲无线视频| 夫妇交换中文字幕| 欧美一激情一区二区三区| www.蜜臀av.com| 日本精品三区| 91在线无精精品一区二区| 最新中文字幕在线观看| 精品一区二区三区的国产在线观看| 国产精品99久久免费观看| 精品精品国产高清a毛片牛牛| 人妻互换一区二区激情偷拍| 国产精品福利av| 91麻豆国产自产在线观看亚洲| 亚洲免费视频网站| 国产一区二区三区在线免费观看| 少妇性bbb搡bbb爽爽爽欧美| 欧美日本一区二区| 欧美两根一起进3p做受视频| 俺也去精品视频在线观看| 亚洲国产图片| 国产精品xxxxxx| 精品国产露脸精彩对白| 91精品久久久久久蜜桃| 日本黄色免费在线观看| 日日夜夜综合| 国产成人免费xxxxxxxx| 狠狠入ady亚洲精品| 亚洲成a人片综合在线| 国产精品nxnn| 亚洲激情视频在线| 国产黄a三级三级看三级| 在线免费观看一级片| 国产精品久久久久久无人区| 播放一区二区| 欧美一级小视频| www.日日操| 91久久久久久久久久久久久| 精品毛片三在线观看| 欧美日韩精品高清| 美女又爽又黄免费视频| 日本少妇高潮喷水xxxxxxx| 色哟哟一一国产精品| 欧美一区日韩一区| 四虎5151久久欧美毛片| 欧美一级免费| 色8久久影院午夜场| 在线亚洲不卡| 在线香蕉视频| 美女把尿口扒开给男人桶视频| 黄色动漫在线| 91香蕉嫩草影院入口| 粉嫩欧美一区二区三区高清影视| 国模叶桐国产精品一区| 3p视频在线观看| 亚洲精品欧美综合四区| 国产精品一区二区久久国产| 四虎永久在线高清国产精品| 羞羞污视频在线观看| 日本视频中文字幕| 日韩欧美黄色片| 激情亚洲小说| 欧美另类在线观看| 免费av一级片| 在线播放中文一区| 欧美色图另类| 欧美91看片特黄aaaa| 国产又粗又猛又爽又黄的视频四季| 国产区精品在线观看| 波多野吉衣在线视频| 欧美18av| 天堂网在线观看在线观看精品| 国产一区二区三区电影在线观看| 青青草原亚洲| 日韩美香港a一级毛片| 春意影院普通入口| 国产精品丝袜高跟| 亚洲综合福利| 老司机成人影院| 成人一二三区视频| 亚洲第一天堂在线观看| 在线免费福利| 国模私拍在线观看| 日本激情免费| 欧美一卡2卡三卡4卡5免费| 尤物在线精品视频| 日韩毛片精品高清免费| 国产在线观看一区二区| 成人三级毛片| 国产免费无码一区二区视频| 亚洲精品自在在线观看| 一本色道久久综合亚洲精品高清| www.99riav| 久久久久亚洲AV成人无码国产| 久久久亚洲午夜电影| 色老综合老女人久久久| 国产片高清在线观看| 女人又爽又黄免费女仆| 国产aⅴ精品一区二区三区久久| 日本在线播放一区二区三区| 欧美成人a∨高清免费观看| 丁香花免费高清完整在线播放| 福利成人在线观看| 中文字幕第24页| 日韩欧美在线中字| 日韩三级电影网| 成人黄在线观看| 久久―日本道色综合久久| 少妇av在线播放| 欧美人与动xxxxz0oz| 日韩区欧美区| 久久一夜天堂av一区二区三区| 激情高潮到大叫狂喷水| 日韩三级免费观看| 国产美女无遮挡永久免费| 欧美xxxx做受欧美.88| 久久亚洲私人国产精品va| 国产精品福利电影| 国产午夜精品全部视频播放| 精品亚洲欧美日韩| 日韩美女视频免费在线观看| 国产精品一国产精品| 羞羞视频网站| 国产剧情av在线| 欧美一区在线看| 小早川怜子久久精品中文字幕| 久久国产精品99精品国产| 热99re久久精品这里都是免费| 亚洲综合视频1区| 欧美绝品在线观看成人午夜影视| 国产在线视视频有精品| 亚洲精品视频一区二区三区| 黄色网址免费在线观看| 成人午夜免费电影| 一本大道熟女人妻中文字幕在线| 少女频道在线观看高清| 中文不卡在线| 国产成人精品免费视频大全软件| 无夜福利视频观看| 在线观看亚洲黄色| 欧美1区2区3区4区| 国产日韩在线看片| 精品夜夜澡人妻无码av| 精品视频在线播放一区二区三区| 国产精品久久国产三级国电话系列| 亚洲成人国产综合| 国产无人区码熟妇毛片多| 国产剧情在线视频| 亚洲欧美日韩综合aⅴ视频| 精品国产91| 粉嫩绯色av一区二区在线观看| 免费看男男www网站入口在线| 成人免费淫片| 国产一级二级三级精品| 亚洲资源网站| 成人免费无码大片a毛片| 日韩欧美一区二区在线视频| 日本电影一区二区在线观看| 在线一区二区三区四区五区| 欧美野外性xxxxfeexxxx| 亚洲人成人一区二区在线观看| 污视频软件在线观看| 亚洲精品自拍第一页| 欧洲一区二区在线观看| 成人精品一区二区三区| 亚洲黄色成人久久久| 国产无码精品在线播放| 69国产精品成人在线播放| 国产欧美精品一区二区三区-老狼| 好吊操视频这里只有精品| 无码人妻黑人中文字幕| 91精品国产综合久久香蕉的特点| 成人激情小说乱人伦| a在线视频观看| αv一区二区三区| 黄色录像一级片| 97久精品国产片一区二区三区| 制服丝袜在线91| 豆国产97在线 | 亚洲| 亚洲精品国产欧美在线观看| 国产精品白丝jk白祙| 伊人一区二区三区久久精品| 亚洲一区二区三区四区中文字幕| 精品久久久久人成| 精品无人国产偷自产在线| 日韩精品在线视频免费观看| 国产高清久久久久| 成人激情av网| av观看在线| 日韩av自拍| 久久久久久爱| 中文在线资源新版官网| 精品国产无码一区二区| 欧美综合精品| 久久69av| 欧美午夜电影在线观看| 丝袜a∨在线一区二区三区不卡| 图片婷婷一区| 神马午夜伦理不卡| 亚洲午夜久久久久中文字幕久| 日韩电影在线观看完整版| 亚洲欧美在线综合| 综合激情网站| 欧美极品少妇全裸体| 亚洲色大成网站www| 久久久久免费看黄a片app| 精品国产一区二区三区四区vr| 在线国产91| h版电影在线播放视频网址| 日本三级中文字幕| 在线免费观看不卡av| 91精品久久久| 国产精品久久久亚洲一区| 日韩欧美国产高清91| 国产欧美日韩丝袜精品一区| 最新国产中文字幕| 日本欧美一区二区在线观看| 性感美女一区二区三区| www.爱爱.com| v天堂中文在线| 97超碰免费观看| 韩国xxxx做受gayxxxx| 欧美三根一起进三p| 麻豆映画在线观看| 久久午夜国产精品| 国产无遮挡裸体免费视频| 性做久久久久久久| 麻豆精品在线播放| 日本女人黄色片| 成人激情视频小说免费下载| 真实乱偷全部视频| 日韩在线视频一区二区三区| 国产精品视频久久一区| 18性欧美xxxⅹ性满足| 亚洲黄色成人| 欧美三级午夜理伦三级中文幕| av电影一区二区| 日本国产中文字幕| 天堂成人娱乐在线视频免费播放网站| 欧美大电影免费观看| 91亚洲永久免费精品| 欧美高清在线一区二区| 欧美电影在线观看免费| 亚洲国产中文字幕在线| 精品在线观看一区二区| 中文字幕v亚洲ⅴv天堂| 亚洲自拍电影| 久久免费精品国产久精品久久久久| 51精产品一区一区三区| 特级西西人体wwwww| 国产真人无码作爱视频免费| 污影院在线观看| 亚洲18色成人| 色999国产精品| 色婷婷久久av| 91系列在线播放| 精品国产美女| 亚洲mm色国产网站| 污污的视频免费| 日韩国产精品一区二区| 欧美性xxxxxbbbbbb精品| 亚洲视频一区二区三区四区| 亚洲天堂2021av| 日韩一区二区在线免费观看| 处破女av一区二区| 欧美日韩黄色一区二区| 久久99精品久久久久久野外| 狠狠干综合网| 阿v天堂2018| 久在线观看福利视频| 男人的天堂网av| 精品婷婷伊人一区三区三| 丰满肥臀噗嗤啊x99av| 免费h视频网站| av黄色一级片| 羞羞色国产精品网站| 亚洲综合欧美色图| 曰本三级在线| 欧美精品激情在线观看| 久草热久草在线频| 91高清视频免费| 成人性免费视频| 麻豆精品不卡国产免费看| 国产美女娇喘av呻吟久久| 美女喷水白浆| 中文精品电影| 亚洲精品一区视频| 色综合久久久久综合| 国产亚洲欧洲黄色| 一区二区三区黄色片| 波多野在线观看| 日本丰满少妇做爰爽爽| 久久国产成人精品| 国产美女诱惑一区二区| 国产精品自产拍在线观看中文| 久久久久九九精品影院| 欧美啪啪精品| 久久精品人人做人人爽电影| 毛片基地在线观看| 56国语精品自产拍在线观看| 免费电影视频在线看| 欧美黄色片视频| 精品视频偷偷看在线观看| 国产精品美女一区二区三区四区| 亚洲欧洲午夜一线一品| 青青草国产成人av片免费| 久久久人成影片一区二区三区| 日韩黄色a级片| 国产精品乱码一区二区三区视频| 国产一区91精品张津瑜| 久草在线视频精品| 欧洲人成人精品| 在线播放蜜桃麻豆| 男女超爽视频免费播放|