美文网首页扣丁学堂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