Skip to content

Commit

Permalink
添加vue+webpack测试demo
Browse files Browse the repository at this point in the history
  • Loading branch information
xiangyuecn committed Dec 3, 2019
1 parent 5c1c836 commit 915a473
Show file tree
Hide file tree
Showing 10 changed files with 485 additions and 16 deletions.
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# :open_book:Recorder用于html5录音

[​](?Ref=Desc&Start)[在线测试](https://xiangyuecn.github.io/Recorder/),支持大部分已实现`getUserMedia`的移动端、PC端浏览器;主要包括:Chrome、Firefox、Safari、Android WebView、腾讯Android X5内核(QQ、微信);不支持:UC系内核(典型的支付宝,大部分国产手机厂商的浏览器),IOS上除Safari外的其他任何形式的浏览器(含PWA、WebClip、任何App内网页)。快捷方式: [【RecordApp测试】](https://jiebian.life/web/h5/github/recordapp.aspx),[【Android、IOS App Demo】](https://github.com/xiangyuecn/Recorder/tree/master/app-support-sample),[【工具】Recorder代码运行和静态分发](https://xiangyuecn.github.io/Recorder/assets/%E5%B7%A5%E5%85%B7-%E4%BB%A3%E7%A0%81%E8%BF%90%E8%A1%8C%E5%92%8C%E9%9D%99%E6%80%81%E5%88%86%E5%8F%91Runtime.html),[【工具】裸(RAW、WAV)PCM转WAV播放测试和转码](https://xiangyuecn.github.io/Recorder/assets/%E5%B7%A5%E5%85%B7-%E8%A3%B8PCM%E8%BD%ACWAV%E6%92%AD%E6%94%BE%E6%B5%8B%E8%AF%95.html) ,[无用户操作测试](https://xiangyuecn.github.io/Recorder/assets/ztest_no_user_operation.html),[【Can I Use】查看浏览器支持情况](https://caniuse.com/#search=getUserMedia)。
[​](?Ref=Desc&Start)[在线测试](https://xiangyuecn.github.io/Recorder/),支持大部分已实现`getUserMedia`的移动端、PC端浏览器;主要包括:Chrome、Firefox、Safari、Android WebView、腾讯Android X5内核(QQ、微信);不支持:UC系内核(典型的支付宝,大部分国产手机厂商的浏览器),IOS上除Safari外的其他任何形式的浏览器(含PWA、WebClip、任何App内网页)。快捷方式: [【RecordApp测试】](https://jiebian.life/web/h5/github/recordapp.aspx),[【vue+webpack测试】](https://xiangyuecn.github.io/Recorder/assets/demo-vue),[【Android、IOS App Demo】](https://github.com/xiangyuecn/Recorder/tree/master/app-support-sample),[【工具】Recorder代码运行和静态分发](https://xiangyuecn.github.io/Recorder/assets/%E5%B7%A5%E5%85%B7-%E4%BB%A3%E7%A0%81%E8%BF%90%E8%A1%8C%E5%92%8C%E9%9D%99%E6%80%81%E5%88%86%E5%8F%91Runtime.html),[【工具】裸(RAW、WAV)PCM转WAV播放测试和转码](https://xiangyuecn.github.io/Recorder/assets/%E5%B7%A5%E5%85%B7-%E8%A3%B8PCM%E8%BD%ACWAV%E6%92%AD%E6%94%BE%E6%B5%8B%E8%AF%95.html) ,[无用户操作测试](https://xiangyuecn.github.io/Recorder/assets/ztest_no_user_operation.html),[【Can I Use】查看浏览器支持情况](https://caniuse.com/#search=getUserMedia)。

录音默认输出mp3格式,另外可选wav格式;有限支持ogg(beta)、webm(beta)、amr(beta)格式;支持任意格式扩展(前提有相应编码器)。

Expand All @@ -15,13 +15,13 @@ mp3使用lamejs编码(CBR),压缩后的recorder.mp3.min.js文件150kb左右(
<p align="center"><a href="https://github.com/xiangyuecn/Recorder"><img width="100" src="https://gitee.com/xiangyuecn/Recorder/raw/master/assets/icon.png" alt="Recorder logo"></a></p>

<p align="center">
<a href="https://github.com/xiangyuecn/Recorder"><img src="https://img.shields.io/github/stars/xiangyuecn/Recorder?color=0b1&logo=github" alt="Stars"></a>
<a href="https://github.com/xiangyuecn/Recorder"><img src="https://img.shields.io/github/forks/xiangyuecn/Recorder?color=0b1&logo=github" alt="Forks"></a>
<a href="https://www.npmjs.com/package/recorder-core"><img src="https://img.shields.io/npm/v/recorder-core?color=f60&logo=npm" alt="npm Version"></a>
<a href="https://www.npmjs.com/package/recorder-core"><img src="https://img.shields.io/npm/dt/recorder-core?color=f60&logo=npm" alt="npm Downloads"></a>
<a href="https://npm.taobao.org/package/recorder-core"><img src="https://npm.taobao.org/badge/v/recorder-core.svg" alt="cnpm Version"></a>
<a href="https://npm.taobao.org/package/recorder-core"><img src="https://npm.taobao.org/badge/d/recorder-core.svg" alt="cnpm Downloads"></a>
<a href="https://github.com/xiangyuecn/Recorder/blob/master/LICENSE"><img src="https://img.shields.io/github/license/xiangyuecn/Recorder?color=0b1&logo=github" alt="License"></a>
<a title="Stars" href="https://github.com/xiangyuecn/Recorder"><img src="https://img.shields.io/github/stars/xiangyuecn/Recorder?color=0b1&logo=github" alt="Stars"></a>
<a title="Forks" href="https://github.com/xiangyuecn/Recorder"><img src="https://img.shields.io/github/forks/xiangyuecn/Recorder?color=0b1&logo=github" alt="Forks"></a>
<a title="npm Version" href="https://www.npmjs.com/package/recorder-core"><img src="https://img.shields.io/npm/v/recorder-core?color=f60&logo=npm" alt="npm Version"></a>
<a title="npm Downloads" href="https://www.npmjs.com/package/recorder-core"><img src="https://img.shields.io/npm/dt/recorder-core?color=f60&logo=npm" alt="npm Downloads"></a>
<a title="cnpm Version" href="https://npm.taobao.org/package/recorder-core"><img src="https://npm.taobao.org/badge/v/recorder-core.svg" alt="cnpm Version"></a>
<a title="cnpm Downloads" href="https://npm.taobao.org/package/recorder-core"><img src="https://npm.taobao.org/badge/d/recorder-core.svg" alt="cnpm Downloads"></a>
<a title="License" href="https://github.com/xiangyuecn/Recorder/blob/master/LICENSE"><img src="https://img.shields.io/github/license/xiangyuecn/Recorder?color=0b1&logo=github" alt="License"></a>
</p>

[](?RefEnd)
Expand Down
14 changes: 7 additions & 7 deletions app-support-sample/README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
[Recorder](https://github.com/xiangyuecn/Recorder/) | RecordApp

<a href="https://github.com/xiangyuecn/Recorder"><img src="https://img.shields.io/github/stars/xiangyuecn/Recorder?color=0b1&logo=github" alt="Stars"></a>
<a href="https://github.com/xiangyuecn/Recorder"><img src="https://img.shields.io/github/forks/xiangyuecn/Recorder?color=0b1&logo=github" alt="Forks"></a>
<a href="https://www.npmjs.com/package/recorder-core"><img src="https://img.shields.io/npm/v/recorder-core?color=f60&logo=npm" alt="npm Version"></a>
<a href="https://www.npmjs.com/package/recorder-core"><img src="https://img.shields.io/npm/dt/recorder-core?color=f60&logo=npm" alt="npm Downloads"></a>
<a href="https://npm.taobao.org/package/recorder-core"><img src="https://npm.taobao.org/badge/v/recorder-core.svg" alt="cnpm Version"></a>
<a href="https://npm.taobao.org/package/recorder-core"><img src="https://npm.taobao.org/badge/d/recorder-core.svg" alt="cnpm Downloads"></a>
<a href="https://github.com/xiangyuecn/Recorder/blob/master/LICENSE"><img src="https://img.shields.io/github/license/xiangyuecn/Recorder?color=0b1&logo=github" alt="License"></a>
<a title="Stars" href="https://github.com/xiangyuecn/Recorder"><img src="https://img.shields.io/github/stars/xiangyuecn/Recorder?color=0b1&logo=github" alt="Stars"></a>
<a title="Forks" href="https://github.com/xiangyuecn/Recorder"><img src="https://img.shields.io/github/forks/xiangyuecn/Recorder?color=0b1&logo=github" alt="Forks"></a>
<a title="npm Version" href="https://www.npmjs.com/package/recorder-core"><img src="https://img.shields.io/npm/v/recorder-core?color=f60&logo=npm" alt="npm Version"></a>
<a title="npm Downloads" href="https://www.npmjs.com/package/recorder-core"><img src="https://img.shields.io/npm/dt/recorder-core?color=f60&logo=npm" alt="npm Downloads"></a>
<a title="cnpm Version" href="https://npm.taobao.org/package/recorder-core"><img src="https://npm.taobao.org/badge/v/recorder-core.svg" alt="cnpm Version"></a>
<a title="cnpm Downloads" href="https://npm.taobao.org/package/recorder-core"><img src="https://npm.taobao.org/badge/d/recorder-core.svg" alt="cnpm Downloads"></a>
<a title="License" href="https://github.com/xiangyuecn/Recorder/blob/master/LICENSE"><img src="https://img.shields.io/github/license/xiangyuecn/Recorder?color=0b1&logo=github" alt="License"></a>


# :open_book:RecordApp 最大限度的统一兼容PC、Android和IOS
Expand Down
12 changes: 12 additions & 0 deletions assets/demo-vue/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# vue+webpack测试

[在线测试](https://xiangyuecn.github.io/Recorder/assets/demo-vue),主要文件为[component/main.vue](https://github.com/xiangyuecn/Recorder/blob/master/assets/demo-vue/component/main.vue)

# 运行方法
## 【1】编译vue源码
```
cnpm install
npm run build-dev
```
## 【2】浏览器访问
然后就可以打开index.html查看效果了
318 changes: 318 additions & 0 deletions assets/demo-vue/component/main.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,318 @@
<style>
body{
word-wrap: break-word;
background:#f5f5f5 center top no-repeat;
background-size: auto 680px;
}
pre{
white-space:pre-wrap;
}
a{
text-decoration: none;
color:#06c;
}
a:hover{
color:#f00;
}
.main{
max-width:700px;
margin:0 auto;
padding-bottom:80px
}
.mainBox{
margin-top:12px;
padding: 12px;
border-radius: 6px;
background: #fff;
--border: 1px solid #0b1;
box-shadow: 2px 2px 3px #aaa;
}
.mainBtn{
display: inline-block;
cursor: pointer;
border: none;
border-radius: 3px;
background: #0b1;
color:#fff;
padding: 0 15px;
margin-right:20px;
line-height: 36px;
height: 36px;
overflow: hidden;
vertical-align: middle;
}
.mainBtn:active{
background: #0a1;
}
.ctrlBtn{
margin-top:10px;
}
</style>


<template>
<div class="main">
<slot name="top"></slot>

<div class="mainBox">
<div>
类型:{{ type }}
<span style="margin:0 20px">
比特率: <input type="text" v-model="bitRate" style="width:60px"> kbps
</span>
采样率: <input type="text" v-model="sampleRate" style="width:60px"> hz
</div>

<div>
<button class="mainBtn ctrlBtn" @click="recOpen">打开录音,请求权限</button>
<button class="mainBtn ctrlBtn" @click="recStart">开始录音</button>
<button class="mainBtn ctrlBtn" @click="recStop">结束录音,并释放资源</button>
</div>
</div>

<div class="mainBox">
<div style="height:100px;width:300px;border:1px solid #ccc;box-sizing: border-box;display:inline-block;vertical-align:bottom" class="ctrlProcessWave"></div>
<div style="height:40px;width:300px;display:inline-block;background:#999;position:relative;vertical-align:bottom">
<div class="ctrlProcessX" style="height:40px;background:#0B1;position:absolute;" :style="{width:powerLevel+'%'}"></div>
<div class="ctrlProcessT" style="padding-left:50px; line-height:40px; position: relative;">{{ duration+"/"+powerLevel }}</div>
</div>
</div>

<div class="mainBox">
<audio ref="LogAudioPlayer" style="width:100%"></audio>

<div class="mainLog">
<div v-for="obj in logs" :key="obj.idx">
<div :style="{color:obj.color==1?'red':obj.color==2?'green':obj.color}">
<!-- <template v-once> 在v-for里存在的bug,参考:https://v2ex.com/t/625317 -->
<span v-once>[{{ getTime() }}]</span><span v-html="obj.msg"/>

<template v-if="obj.res">
{{ intp(obj.res.rec.set.bitRate,3) }}kbps
{{ intp(obj.res.rec.set.sampleRate,5) }}hz
编码{{ intp(obj.res.blob.size,6) }}b
[{{ obj.res.rec.set.type }}]{{ intp(obj.res.duration,6) }}ms

<button @click="recdown(obj.idx)">下载</button>
<button @click="recplay(obj.idx)">播放</button>

<span v-html="obj.playMsg"></span>
<span v-if="obj.down">
<span style="color:red">{{ obj.down }}</span>

没弹下载?试一下链接或复制文本<button @click="recdown64(obj.idx)">生成Base64文本</button>

<textarea v-if="obj.down64Val" v-model="obj.down64Val"></textarea>
</span>
</template>
</div>
</div>
</div>
</div>

<div v-if="recOpenDialogShow" style="z-index:99999;width:100%;height:100%;top:0;left:0;position:fixed;background:rgba(0,0,0,0.3);">
<div style="display:flex;height:100%;align-items:center;">
<div style="flex:1;"></div>
<div style="width:240px;background:#fff;padding:15px 20px;border-radius: 10px;">
<div style="padding-bottom:10px;">录音功能需要麦克风权限,请允许;如果未看到任何请求,请点击忽略~</div>
<div style="text-align:center;"><a @click="waitDialogClick" style="color:#0B1">忽略</a></div>
</div>
<div style="flex:1;"></div>
</div>
</div>

<slot name="bottom"></slot>
</div>
</template>












<script>
import Recorder from 'recorder-core'
module.exports={
data(){
return {
type:"mp3"
,bitRate:16
,sampleRate:16000
,rec:0
,duration:0
,powerLevel:0
,recOpenDialogShow:0
,logs:[]
}
}
,methods:{
recOpen:function(){
var This=this;
var rec=this.rec=Recorder({
type:This.type
,bitRate:This.bitRate
,sampleRate:This.sampleRate
,onProcess:function(buffers,powerLevel,duration,sampleRate){
This.duration=duration;
This.powerLevel=powerLevel;
This.wave.input(buffers[buffers.length-1],powerLevel,sampleRate);
}
});
This.dialogInt=setTimeout(function(){//定时8秒后打开弹窗,用于监测浏览器没有发起权限请求的情况
This.showDialog();
},8000);
rec.open(function(){
This.dialogCancel();
This.reclog("已打开:"+This.type+" "+This.sampleRate+"hz "+This.bitRate+"kbps",2);
This.wave=Recorder.WaveView({elem:".ctrlProcessWave"});
},function(msg,isUserNotAllow){
This.dialogCancel();
This.reclog((isUserNotAllow?"UserNotAllow,":"")+"打开失败:"+msg,1);
});
This.waitDialogClickFn=function(){
This.dialogCancel();
This.reclog("打开失败:权限请求被忽略,用户主动点击的弹窗",1);
};
}
,recStart:function(){
if(!this.rec){
this.reclog("未打开录音",1);
return;
}
this.rec.start();
var set=this.rec.set;
this.reclog("录制中:"+set.type+" "+set.sampleRate+"hz "+set.bitRate+"kbps");
}
,recStop:function(){
var This=this;
var rec=This.rec;
This.rec=null;
if(!rec){
This.reclog("未打开录音",1);
return;
}
rec.stop(function(blob,duration){
This.reclog("已录制:","",{
blob:blob
,duration:duration
,rec:rec
});
},function(s){
This.reclog("结束出错:"+s,1);
},true);//自动close
}
,reclog:function(msg,color,res){
this.logs.splice(0,0,{
idx:this.logs.length
,msg:msg
,color:color
,res:res
,playMsg:""
,down:0
,down64Val:""
});
}
,recplay:function(idx){
var This=this;
var o=this.logs[this.logs.length-idx-1];
o.play=(o.play||0)+1;
var logmsg=function(msg){
o.playMsg='<span style="color:green">'+o.play+'</span> '+This.getTime()+" "+msg;
};
logmsg("");
var audio=this.$refs.LogAudioPlayer;
audio.controls=true;
if(!(audio.ended || audio.paused)){
audio.pause();
};
audio.onerror=function(e){
logmsg('<span style="color:red">播放失败['+audio.error.code+']'+audio.error.message+'</span>');
};
audio.src=(window.URL||webkitURL).createObjectURL(o.res.blob);
audio.play();
}
,recdown:function(idx){
var This=this;
var o=this.logs[this.logs.length-idx-1];
o.down=(o.down||0)+1;
o=o.res;
var name="rec-"+o.duration+"ms-"+(o.rec.set.bitRate||"-")+"kbps-"+(o.rec.set.sampleRate||"-")+"hz."+(o.rec.set.type||(/\w+$/.exec(o.blob.type)||[])[0]||"unknown");
var downA=document.createElement("A");
downA.href=(window.URL||webkitURL).createObjectURL(o.blob);
downA.download=name;
downA.click();
}
,recdown64:function(idx){
var This=this;
var o=this.logs[this.logs.length-idx-1];
var reader = new FileReader();
reader.onloadend = function() {
o.down64Val=reader.result;
};
reader.readAsDataURL(o.res.blob);
}
,getTime:function(){
var now=new Date();
var t=("0"+now.getHours()).substr(-2)
+":"+("0"+now.getMinutes()).substr(-2)
+":"+("0"+now.getSeconds()).substr(-2);
return t;
}
,intp:function(s,len){
s=s==null?"-":s+"";
if(s.length>=len)return s;
return ("_______"+s).substr(-len);
}
,showDialog:function(){
//我们可以选择性的弹一个对话框:为了防止移动端浏览器存在第三种情况:用户忽略,并且(或者国产系统UC系)浏览器没有任何回调
if(!/mobile/i.test(navigator.userAgent)){
return;//只在移动端开启没有权限请求的检测
};
this.recOpenDialogShow=1;
}
,dialogCancel:function(){
clearTimeout(this.dialogInt);
this.recOpenDialogShow=0;
}
,waitDialogClick:function(){
this.dialogCancel();
this.waitDialogClickFn();
}
}
}
</script>
6 changes: 6 additions & 0 deletions assets/demo-vue/dist/index.js

Large diffs are not rendered by default.

Loading

0 comments on commit 915a473

Please sign in to comment.