85
1
/******************
2
《本工具使用示例,和Recorder基础用法》
3
作者:高坚果
4
时间:2019-9-12 21:59:19
5
6
工具的编辑框内可编写代码然后运行;代码内可调用本工具提供的Runtime的方法,使用了这些方法时,如果要copy代码到其他html内使用,需要把Runtime相关的调用删除或使用别的代码代替。
7
8
可调用Runtime方法列表:
9
RootFolder:"" 当前程序根目录,结尾不含/
10
11
Runtime.Import(jsList) 导入js列表,只能调用一次,jsList:[{url:"",check:fn()},...] check返回false跳过这条的导入
12
13
Runtime.Ctrls(ctrls) 在控制区显示按钮,只能调用一次,ctrls:[{name:"按钮名称",click:"函数名称",cls:"class name"},{html:"html代码"},{choiceFile:{multiple:true,name:"音乐",title:"转换",mime:"audio/*",process:fn(fileName,arrayBuffer,filesCount,fileIdx,endCall)}},...]
14
15
Runtime.ReadBlob(blob,call) 读取blob为arrayBuffer,call(arrayBuffer)
16
17
Runtime.DecodeAudio(fileName,arrayBuffer,True,False) 解码一个音频文件,True({sampleRate:采样率,duration:音频时长,srcBlob:Blob对象,type:从文件名中提取的音频类型,data:[Int16,...]pcm数据}),False(errMsg)
18
19
Runtime.Log(msgHtml,color) 在日志区显示日志html,color:0默认,1红色,2绿色,其他指定颜色
20
21
Runtime.LogAudio(blob,duration,rec,msgHtml) 在日志区显示一个音频的日志信息,rec只要对象内有set属性就行
22
23
Runtime.Process(buffers,powerLevel,bufferDuration,bufferSampleRate) 接受Recorder的实时回调,驱动图形显示
24
******************/
25
26
/*****加载框架,把这几个js用script标签引入到html就可以进行mp3录音*****/
27
Runtime.Import([
28
{url:RootFolder+"/src/recorder-core.js",check:function(){return !window.Recorder}}
29
,{url:RootFolder+"/src/engine/mp3.js",check:function(){return !Recorder.prototype.mp3}}
30
,{url:RootFolder+"/src/engine/mp3-engine.js",check:function(){return !Recorder.lamejs}}
31
]);
32
33
/*****显示控制按钮和界面控制,这几坨代码无关紧要*****/
34
Runtime.Ctrls([
35
{name:"打开录音,请求权限",click:"recOpen"}
36
,{name:"开始录音",click:"recStart"}
37
,{name:"结束录音,并释放资源",click:"recStop"}
38
]);
39
40
41
/*****录音核心代码*****/
42
var rec;
43
/**调用open打开录音请求好录音权限**/
44
var recOpen=function(){//一般在显示出录音按钮或相关的录音界面时进行此方法调用,后面用户点击开始录音时就能畅通无阻了
45
rec=Recorder({
46
type:"mp3",sampleRate:16000,bitRate:16
47
,onProcess:function(buffers,powerLevel,bufferDuration,bufferSampleRate){
48
Runtime.Process.apply(null,arguments);
49
}
50
});
51
52
//if(Is Mobile)//只针对移动端,demo偷一下懒
53
var t=setTimeout(function(){
54
Runtime.Log("无法录音:权限请求被忽略(超时假装手动点击了确认对话框)",1);
55
},8000);
56
57
Runtime.Log("正在打开录音,请求麦克风权限...");
58
rec.open(function(){
59
clearTimeout(t);
60
61
Runtime.Log("已打开录音,可以点击开始了",2);
62
63
//rec.start() 此处可以立即开始录音,但不建议这样编写,因为open是一个延迟漫长的操作,通过两次用户操作来分别调用open和start是推荐的最佳流程
64
},function(msg,isUserNotAllow){//用户拒绝未授权或不支持
65
clearTimeout(t);
66
Runtime.Log((isUserNotAllow?"UserNotAllow,":"")+"无法录音:"+msg, 1);
67
});
68
};
69
/**开始录音**/
70
function recStart(){//打开了录音后才能进行start、stop调用,demo偷一下懒,按钮、判断啥都没有处理
71
rec.start();
72
};
73
/**结束录音**/
74
function recStop(){
75
rec.stop(function(blob,duration){
76
rec.close();//释放录音资源,当然可以不释放,后面可以连续调用start;但不释放时系统或浏览器会一直提示在录音,最佳操作是录完就close掉
77
78
Runtime.LogAudio(blob,duration,rec);
79
rec=null;
80
},function(msg){
81
Runtime.Log("录音失败:"+msg, 1);
82
rec.close();//可以通过stop方法的第3个参数来自动调用close
83
rec=null;
84
});
85
};
[06:50:23]已在编辑框内显示了《1. 【教程】本工具使用示例,和Recorder基础用法》Demo的源码,可运行查看效果
[06:50:23]已在编辑框内显示了《1. 【教程】本工具使用示例,和Recorder基础用法》Demo的源码,可运行查看效果
Demo 列表 点击编辑和运行
如果你有蛮有意思的有价值代码片段,欢迎把代码放到assets/runtime-codes目录内提交PR,我们共同丰富这个Demo列表😜