Recorder:recorder-core 用于html5录音
GitHub: https://github.com/xiangyuecn/Recorder
Gitee: https://gitee.com/xiangyuecn/Recorder
文档和详细使用方法请参考上面两个Recorder仓库。npm recorder这个名字已被使用,因此在Recorder基础上增加后缀-core,就命名为recorder-core,和Recorder核心文件同名。
如何使用
使用npm安装
npm install recorder-core
引入Recorder库
可以使用import
、require
、html script
等你适合的方式来引入js文件,下面的以import为主要参考,其他引入方式根据文件路径自行调整一下就可以了。
import Recorder from 'recorder-core'
import 'recorder-core/src/engine/mp3'
import 'recorder-core/src/engine/mp3-engine'
import 'recorder-core/src/extensions/waveview'
import RecordApp from 'recorder-core/src/app-support/app'
Recorder调用录音
这里假设只录3秒,录完后立即播放,在线编辑运行此代码>>。录音结束后得到的是Blob二进制文件对象,可以下载保存成文件、用FileReader
读取成ArrayBuffer
或者Base64
给js处理,或者参考下一节上传示例直接上传。
var rec,processTime,wave;
var recOpen=function(success){
rec=Recorder({
type:"mp3",sampleRate:16000,bitRate:16
,onProcess:function(buffers,powerLevel,bufferDuration,bufferSampleRate,newBufferIdx,asyncEnd){
processTime=Date.now();
wave&&wave.input(buffers[buffers.length-1],powerLevel,bufferSampleRate);
}
});
rec.open(function(){
if(Recorder.WaveView)wave=Recorder.WaveView({elem:".recwave"});
success&&success();
},function(msg,isUserNotAllow){
console.log((isUserNotAllow?"UserNotAllow,":"")+"无法录音:"+msg);
});
};
function recStart(){
rec.start();
var wdt=rec.watchDogTimer=setInterval(function(){
if(!rec || wdt!=rec.watchDogTimer){ clearInterval(wdt); return }
if(Date.now()<rec.wdtPauseT) return;
if(Date.now()-(processTime||startTime)>1500){ clearInterval(wdt);
console.error(processTime?"录音被中断":"录音未能正常开始");
}
},1000);
var startTime=Date.now(); rec.wdtPauseT=0; processTime=0;
};
function recStop(){
rec.watchDogTimer=0;
rec.stop(function(blob,duration){
var localUrl=(window.URL||webkitURL).createObjectURL(blob);
console.log(blob,localUrl,"时长:"+duration+"ms");
rec.close();
rec=null;
var audio=document.createElement("audio");
document.body.prepend(audio);
audio.controls=true;
audio.src=localUrl;
audio.play();
},function(msg){
console.log("录音失败:"+msg);
rec.close();
rec=null;
});
};
recOpen(function(){
recStart();
setTimeout(recStop,3000);
});
RecordApp调用录音
RecordApp的基础调用方式在所有平台环境下是通用的;但不同环境下可能会提供更多的方法、或配置参数以供使用,多出来的请参考对应的平台环境支持说明。
var recReq=function(success){
RecordApp.RequestPermission(function(){
success&&success();
},function(msg,isUserNotAllow){
console.log((isUserNotAllow?"UserNotAllow,":"")+"无法录音:"+msg);
});
};
var recStart=function(success){
var processTime=0;
RecordApp.Start({
type:"mp3",sampleRate:16000,bitRate:16
,onProcess:function(buffers,powerLevel,bufferDuration,bufferSampleRate,newBufferIdx,asyncEnd){
processTime=Date.now();
}
},function(){
success&&success();
var this_= RecordApp;
if(RecordApp.Current.CanProcess()){
var wdt=this_.watchDogTimer=setInterval(function(){
if(wdt!=this_.watchDogTimer){ clearInterval(wdt); return }
if(Date.now()<this_.wdtPauseT) return;
if(Date.now()-(processTime||startTime)>1500){ clearInterval(wdt);
console.error(processTime?"录音被中断":"录音未能正常开始");
}
},1000);
}else{
console.warn("当前环境不支持onProcess回调,不启用watchDogTimer");
}
var startTime=Date.now(); this_.wdtPauseT=0;
},function(msg){
console.log("开始录音失败:"+msg);
});
};
var recPause=function(){
if(RecordApp.GetCurrentRecOrNull()){
RecordApp.Pause();
var this_=RecordApp;this_.wdtPauseT=Date.now()*2;
console.log("已暂停");
}
};
var recResume=function(){
if(RecordApp.GetCurrentRecOrNull()){
RecordApp.Resume();
var this_=RecordApp;this_.wdtPauseT=Date.now()+1000;
console.log("继续录音中...");
}
};
var recStop=function(){
var this_=RecordApp;this_.watchDogTimer=0;
RecordApp.Stop(function(arrayBuffer,duration,mime){
console.log(arrayBuffer,mime,"时长:"+duration+"ms");
if(typeof(Blob)!="undefined" && typeof(window)=="object"){
var blob=new Blob([arrayBuffer],{type:mime});
console.log(blob, (window.URL||webkitURL).createObjectURL(blob));
}
},function(msg){
console.log("录音失败:"+msg);
});
};
recReq(function(){
recStart(function(){
setTimeout(recStop,3000);
});
});