侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

录音

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 128 阅读 / 2,919 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
(function (exports) {
var MP3Recorder = function (config) {

    var recorder = this;
    config = config || {};
    config.sampleRate = config.sampleRate || 48000;
    config.bitRate = config.bitRate || 128;
    var recordCount=0;

    navigator.getUserMedia = navigator.getUserMedia ||
                             navigator.webkitGetUserMedia ||
                             navigator.mozGetUserMedia ||
                             navigator.msGetUserMedia;

    if (navigator.getUserMedia) {
        navigator.getUserMedia({
            audio: true
        },
        function (stream) {
            var context = new AudioContext(),
                microphone = context.createMediaStreamSource(stream),
                processor = context.createScriptProcessor(0, 1, 1),//bufferSize大小,输入channel数,输出channel数
                mp3ReceiveSuccess, currentErrorCallback;

            config.sampleRate = context.sampleRate;
			
            processor.onaudioprocess = function (event) {
                //边录音边转换
                var array = event.inputBuffer.getChannelData(0);
				//ws.send(array.buffer);
                realTimeWorker.postMessage({ cmd: 'encode', buf: array});
            };

            var realTimeWorker = new Worker('app/audio/worker-realtime.js');
			//var wsinit = 0;
			//var ws;

            realTimeWorker.onmessage = function (e) {
                switch (e.data.cmd) {
                    case 'init':
                        log('初始化成功');
                        if (config.funOk) {
                            config.funOk();
                        }
                        break;
					case 'encode':
					
						//let blob = new Blob(e.data.buf, {type: 'audio/mp3'});
						//ws.send(blob);
						break;
                    case 'end':
						
                        log('MP3大小:', e.data.buf.length);
                        if (mp3ReceiveSuccess) {
                            mp3ReceiveSuccess(new Blob(e.data.buf, { type: 'audio/mp3' }));
                        }
                        break;
                    case 'error':
                        log('错误信息:' + e.data.error);
                        if (currentErrorCallback) {
                            currentErrorCallback(e.data.error);
                        }
                        break;
                    default:
                        log('未知信息:', e.data);
                }
            };

            recorder.getMp3Blob = function (onSuccess, onError) {
                currentErrorCallback = onError;
                mp3ReceiveSuccess = onSuccess;
                realTimeWorker.postMessage({ cmd: 'finish' });
            };

            recorder.start = function () {
                if (processor && microphone) {
                    microphone.connect(processor);
                    processor.connect(context.destination);
                    log('开始录音');
                }
            }

            recorder.stop = function () {
                if (processor && microphone) {
                    microphone.disconnect();
                    processor.disconnect();
                    log('录音结束');
                }
            }

            recorder.addWorker = function (index,url) {
                if(recordCount===0)
                    this.start();
                realTimeWorker.postMessage({cmd:"add",buf:{index:index,url:url}});
                recordCount++;
            }
            recorder.stopWorker = function (index) {
                realTimeWorker.postMessage({cmd:"reduce",buf:{index:index}});
                recordCount--;
                if(recordCount===0)
                    this.stop();
            }

            realTimeWorker.postMessage({
                cmd: 'init',
                config: {
                    sampleRate: config.sampleRate,
                    bitRate: config.bitRate
                }
            });
        },
        function (error) {
            var msg;
            switch (error.code || error.name) {
                case 'PERMISSION_DENIED':
                case 'PermissionDeniedError':
                    msg = '用户拒绝访问麦客风';
                    break;
                case 'NOT_SUPPORTED_ERROR':
                case 'NotSupportedError':
                    msg = '浏览器不支持麦客风';
                    break;
                case 'MANDATORY_UNSATISFIED_ERROR':
                case 'MandatoryUnsatisfiedError':
                    msg = '找不到麦客风设备';
                    break;
                default:
                    msg = '无法打开麦克风,异常信息:' + (error.code || error.name);
                    break;
            }
            if (config.funCancel) {
                config.funCancel(msg);
            }
        });
    } else {
        if (config.funCancel) {
            config.funCancel('当前浏览器不支持录音功能');
        }
    }

    function log(str) {
        if (config.debug) {
            console.log(str);
        }
    }
}

exports.MP3Recorder = MP3Recorder;

})(window);




this.audioRecorder = new MP3Recorder({
                    debug: true,
                    funOk: function () {
                        resolve();
                        console.log('初始化成功');
                    },
                    funCancel: function (msg) {
                        console.log(msg);
                        recorder = null;
                    }
                });
0

评论区