美文网首页扣丁学堂HTML5培训
扣丁学堂HTML5培训详解HTML5录音如何操作

扣丁学堂HTML5培训详解HTML5录音如何操作

作者: 994d14631d16 | 来源:发表于2018-07-05 11:07 被阅读3次

不知道有多少的小伙伴接触过HTML5的 Audio API,本篇文章扣丁学堂HTML5培训小编就和大家分享一下HTML5录音方面的问题,文章中会有代码列出,对HTML5开发感兴趣的小伙伴就随着小编一起来了解一下吧。

扣丁学堂HTML5培训

开始录音前,要先获取当前设备是否支持 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 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;

}

因为这个方法是异步的,所以我们可以对无法兼容的设备进行友好的提示

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;

};

以上就是扣丁学堂HTML5在线学习小编给大家分享的HTML5录音方面的问题,希望对小伙伴们有所帮助。想要了解更多内容的小伙伴可以登录扣丁学堂官网咨询,扣丁学堂是专业的HTML5培训机构,不仅有专业的老师和与时俱进的课程体系,还有大量的HTML5在线教程供学员观看学习,想要学习HTML5开发的小伙伴快快行动吧。

相关文章

网友评论

    本文标题:扣丁学堂HTML5培训详解HTML5录音如何操作

    本文链接:https://www.haomeiwen.com/subject/ornuuftx.html