You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
5.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

(function(exports){
//公共方法
var Util = {
//初始化
init: function(){
navigator.getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia;
window.AudioContext = window.AudioContext ||
window.webkitAudioContext;
},
//日志
log: function(){
console.log.apply(console,arguments);
}
};
//构造函数
var Recorder = function(config){
var _this = this;
config = config || {}; //初始化配置对象
config.sampleRate = config.sampleRate || 44100; //采样频率默认为44100Hz(标准MP3采样率)
config.bitRate = config.bitRate || 128; //比特率默认为128kbps(标准MP3质量)
Util.init();
if(navigator.getUserMedia){
navigator.getUserMedia({
audio: true //配置对象
},
function(stream){ //成功回调
var context = new AudioContext(),
microphone = context.createMediaStreamSource(stream), //媒体流音频源
processor = context.createScriptProcessor(16384,1,1), //js音频处理器
successCallback, errorCallback;
config.sampleRate = context.sampleRate;
processor.onaudioprocess = function(event){
//监听音频录制过程
var array = event.inputBuffer.getChannelData(0);
realTimeWorker.postMessage({ cmd: 'encode', buf: array });
};
var realTimeWorker = new Worker('js/worker.js'); //开启后台线程
realTimeWorker.onmessage = function(e){ //主线程监听后台线程,实时通信
switch(e.data.cmd){
case 'init':
Util.log('初始化成功');
if(config.success){
config.success();
}
break;
case 'end':
if(successCallback){
var blob = new Blob(e.data.buf, { type: 'audio/mp3' });
successCallback(blob);
Util.log('MP3大小' + blob.size + '%cB', 'color:#0000EE');
}
break;
case 'error':
Util.log('错误信息:' + e.data.error);
if(errorCallback){
errorCallback(e.data.error);
}
break;
default:
Util.log('未知信息:' + e.data);
}
};
//接口列表
//开始录音
_this.start = function(){
if(processor && microphone){
microphone.connect(processor);
processor.connect(context.destination);
Util.log('开始录音');
}
};
//结束录音
_this.stop = function(){
if(processor && microphone){
microphone.disconnect();
processor.disconnect();
Util.log('录音结束');
}
};
//获取blob格式录音文件
_this.getBlob = function(onSuccess, onError){
successCallback = onSuccess;
errorCallback = onError;
realTimeWorker.postMessage({ cmd: 'finish' });
};
realTimeWorker.postMessage({
cmd: 'init',
config: {
sampleRate: config.sampleRate,
bitRate: config.bitRate
}
});
},
function(error){ //失败回调
var msg;
switch(error.code || error.name){
case 'PermissionDeniedError':
case 'PERMISSION_DENIED':
case 'NotAllowedError':
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;
}
Util.log(msg);
if(config.error){
config.error(msg);
}
});
}else{
Util.log('当前浏览器不支持录音功能');
if(config.fix){
config.fix('当前浏览器不支持录音功能');
}
}
};
//模块接口
exports.Recorder = Recorder;
})(window);