Skip to content

Commit

Permalink
更新文档
Browse files Browse the repository at this point in the history
  • Loading branch information
xiangyuecn committed Jan 3, 2024
1 parent 4747184 commit 8748fa2
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 13 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

# :open_book:Recorder用于html5录音

支持在大部分已实现`getUserMedia`的移动端、PC端浏览器麦克风录音、实时处理,主要包括:Chrome、Firefox、Safari、iOS 14.3+、Android WebView、腾讯Android X5内核(QQ、微信、小程序WebView)、Electron、大部分2021年后更新的Android手机自带浏览器;不支持:~~UC系内核(典型的支付宝),大部分未更新的老旧国产手机自带浏览器,低版本iOS(11.0-14.2)上除Safari外的其他任何形式的浏览器~~
支持在大部分已实现`getUserMedia`的移动端、PC端浏览器麦克风录音、实时处理,主要包括:Chrome、Firefox、Safari、iOS 14.3+、Android WebView、腾讯Android X5内核(QQ、微信、小程序WebView)、Electron、大部分2021年后更新的Android手机自带浏览器、2024年后更新的Android版UC内核(支付宝、钉钉);不支持:~~Android版UC/夸克浏览器、老旧国产手机自带浏览器、老旧iOS(11.0-14.2)上除Safari外的其他任何形式的浏览器~~

支持在非浏览器环境中使用部分功能(如nodejs、各种使用js来构建的程序),使用[RecordApp](./app-support-sample)可在微信小程序、uni-app中直接录音。

Expand Down Expand Up @@ -1393,13 +1393,13 @@ EncodeMix对象:
依赖文件:`g711x.js`,g711a: G.711 A-law (pcma),g711u: G.711 μ-law (pcmu、mu-law);支持g711的编码和解码,支持实时编码(边录边转码),编解码源码移植自:`https://github.com/twstx1/codec-for-audio-in-G72X-G711-G723-G726-G729/blob/master/G711_G721_G723/g711.c`;固定为8000hz采样率、16位,每个采样压缩成8位存储,音频文件大小为8000字节/秒。

### Recorder.g711a_encode|g711u_encode(pcm)
编码任意采样率的pcm得到g711x数据。pcm: Int16Array,任意采样率pcm数据(标准采样率为8000)。返回Uint8Array,g711x二进制数据(采样率为pcm的采样率)。
编码任意采样率的pcm得到g711x数据。pcm: Int16Array,任意采样率pcm数据(标准采样率为8000,其它采样率的pcm可使用Recorder.SampleData方法来转成8000采样率)。返回Uint8Array,g711x二进制数据(采样率为pcm的采样率)。

### Recorder.g711a_decode|g711u_decode(bytes)
解码g711x得到pcm,`bytes`: Uint8Array,g711x二进制数据;返回Int16Array,为8000采样率、16位的pcm数据。
解码g711x得到pcm,`bytes`: Uint8Array,g711x二进制数据,采样率一般是8000;返回Int16Array,为g711x的采样率、16位的pcm数据。

### Recorder.g711a2wav|g711u2wav(g711xBlob,True,False)
已实现把g711a、g711u转成wav格式来播放的方法,`g711xBlob为g711x音频文件blob对象``True=fn(wavBlob,duration)`;要使用此方法需要带上`wav`格式编码器。
已实现把g711a、g711u转成wav格式来播放的方法,`g711xBlob为g711x音频文件blob对象 或 ArrayBuffer(回调也将返回ArrayBuffer),采样率只支持8000``True=fn(wavBlob,duration)`;要使用此方法需要带上`wav`格式编码器。


## ogg (Vorbis) 格式
Expand Down
10 changes: 6 additions & 4 deletions app-support-sample/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ import 'recorder-core/src/extensions/waveview'
import RecordApp from 'recorder-core/src/app-support/app'

//引入特定平台环境下的支持文件(也可以统统引入进来,非对应的环境下运行时会忽略掉)
//import 'recorder-core/src/app-support/app-native-support.js' //App下的原生录音支持文件
//import 'recorder-core/src/app-support/app-native-support.js' //App下的原生录音支持文件(App中未提供原生支持时可以不提供,统统走H5录音)
//import 'recorder-core/src/app-support/app-miniProgram-wx-support.js' //微信小程序下的录音支持文件
//import '@/uni_modules/Recorder-UniCore/app-uni-support.js' //uni-app下的支持文件,请参考本文档目录下的demo_UniApp测试项目

Expand All @@ -80,14 +80,16 @@ import RecordApp from 'recorder-core/src/app-support/app'
[](?RefEnd)

### 在App WebView、H5页面中使用
可以通过阅读和运行本目录下的[QuickStart.html](https://xiangyuecn.gitee.io/recorder/app-support-sample/QuickStart.html)文件来快速入门学习,你可以直接将此html文件copy 到你的(https)网站中,无需其他文件,就能正常开始测试了,Android、iOS App内同样适用
可以通过阅读和运行本目录下的[QuickStart.html](https://xiangyuecn.gitee.io/recorder/app-support-sample/QuickStart.html)文件来快速入门学习,你可以直接将此html文件copy 到你的(https)网站中,无需其他文件,就能正常开始测试了,H5、Android App、iOS App内均适用

RecordApp默认未开启App内原生录音支持,可开启后在App环境中将走Native原生录音,其他情况下默认走H5录音。在Android、iOS App内使用`demo_android``demo_ios`目录内的`RecordAppJsBridge.java``RecordAppJsBridge.swift`,即可开启原生录音支持,本目录下的`native-config.js`文件内实现了对App的JsBridge调用(copy过去使用)。
RecordApp默认未开启App内原生录音支持,App内默认也使用H5录音(简单通用),可选开启支持后在App环境中将走Native原生录音(需要App配合)。

如何开启可选的原生录音支持:在Android、iOS App内使用`demo_android``demo_ios`目录内的`RecordAppJsBridge.java``RecordAppJsBridge.swift` 即可开启支持,本目录下的`native-config.js`文件内实现了对App的JsBridge调用(copy过去使用)。

关于App的系统录音权限:使用原生录音时,JsBridge会自动处理App的录音权限;使用H5录音时,需要先自行处理好App的系统录音权限;更多请参考下面的App权限部分。

``` javascript
//开启App原生录音需要引入的文件,不引入就使用默认的H5录音
//可选 开启App原生录音需要引入的文件,不引入时App中也统统使用默认的H5录音
import 'recorder-core/src/app-support/app-native-support.js' //App下的原生录音支持文件

//引入配置文件
Expand Down
6 changes: 6 additions & 0 deletions app-support-sample/demo_UniApp/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.hbuilderx
unpackage
node_modules
package-lock.json

use-uni-app.png
6 changes: 4 additions & 2 deletions app-support-sample/demo_UniApp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ data() { return {} } //视图没有引用到的变量无需放data里,直接th

,takeoffEncodeChunk:true?null:(chunkBytes)=>{
//全平台通用:实时接收到编码器编码出来的音频片段数据,chunkBytes是Uint8Array二进制数据,可以实时上传(发送)出去
//App中如果未配置Recorder.UniWithoutAppRenderjs时,建议提供此回调,因为录音结束后会将整个录音文件从renderjs传回逻辑层,由于uni-app的逻辑层和renderjs层数据交互性能实在太拉跨了,大点的文件传输会比较慢,提供此回调后可避免Stop时产生超大数据回传
//App中如果未配置RecordApp.UniWithoutAppRenderjs时,建议提供此回调,因为录音结束后会将整个录音文件从renderjs传回逻辑层,由于uni-app的逻辑层和renderjs层数据交互性能实在太拉跨了,大点的文件传输会比较慢,提供此回调后可避免Stop时产生超大数据回传
}
,takeoffEncodeChunk_renderjs:true?null:`function(chunkBytes){
//App中这里可以做一些仅在renderjs中才生效的事情,不提供也行,this是renderjs模块的this(也可以用This变量)
Expand Down Expand Up @@ -494,9 +494,11 @@ RecordApp.UniNativeUtsPlugin=RecNativePlugin||RecUtsPlugin;

## 获取商用授权和购买原生录音插件
客服联系方式:QQ 1251654593 ,或者直接联系作者QQ 753610399 (回复可能没有客服及时)。
- 方式一:联系客服加入VIP支持QQ群,入群费用**¥199元**,入群后即获得授权,在群文件中可下载`app-uni-support.js`文件最新源码。
- 方式一:联系客服加入VIP支持QQ群,入群费用 **¥199元** ,入群后即获得授权,在群文件中可下载`app-uni-support.js`文件最新源码。
- 方式二:联系客服或到DCloud插件市场购买配套的原生录音插件或uts插件,购买后即获得授权;购买后可联系客服,同时提供订单信息,客服拉你进入VIP支持QQ群。

**优惠活动:2024年01月01日起付费 ¥199 元入群后,可 ¥1 元购Android版原生录音插件`.aar module`(后续如需iOS版原生录音插件补¥299元差价即可购买)。**

> 目前uts插件还在开发中不可购买;原生录音插件已开发好,但还未上架到DCloud插件市场,如果需要请联系客服付费购买,原生录音插件价格为:**¥499元**(可买单个平台¥299元,已付费入群可补差价购买),购买后客服会发送Android的`.aar module 25KB`、iOS的`.a library 200KB`两个文件给你,和demo项目供参考,集成到项目的`nativeplugins`目录中,详细使用请参考上面的`RecordApp.UniNativeUtsPlugin`属性文档。
> 注:VIP支持群的主要作用是代表你已获得授权许可,可以随时获得`app-uni-support.js`文件最新版源码;不作为问答或售后群使用,当然如果你有问题也可以直接群里问,花费时间不多的,作者免费顺带就解答了,如果复杂花费比较久时间的,可能要适当收点人工费用,或者选择进行付费指导。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ export default {

,takeoffEncodeChunk:!this.takeoffEncodeChunkSet?null:(chunkBytes)=>{
//全平台通用:实时接收到编码器编码出来的音频片段数据,chunkBytes是Uint8Array二进制数据,可以实时上传(发送)出去
//App中如果未配置Recorder.UniWithoutAppRenderjs时,建议提供此回调,因为录音结束后会将整个录音文件从renderjs传回逻辑层,由于uni-app的逻辑层和renderjs层数据交互性能实在太拉跨了,大点的文件传输会比较慢,提供此回调后可避免Stop时产生超大数据回传
//App中如果未配置RecordApp.UniWithoutAppRenderjs时,建议提供此回调,因为录音结束后会将整个录音文件从renderjs传回逻辑层,由于uni-app的逻辑层和renderjs层数据交互性能实在太拉跨了,大点的文件传输会比较慢,提供此回调后可避免Stop时产生超大数据回传
takeEcCount++; takeEcSize+=chunkBytes.byteLength;
this.takeoffEncodeChunkMsg="已接收到"+takeEcCount+"块,共"+takeEcSize+"字节";
this.takeEcChunks.push(chunkBytes);
Expand Down
2 changes: 1 addition & 1 deletion app-support-sample/demo_UniApp/pages/recTest/page_i18n.vue
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ export default {

,takeoffEncodeChunk:!this.takeoffEncodeChunkSet?null:(chunkBytes)=>{
//全平台通用:实时接收到编码器编码出来的音频片段数据,chunkBytes是Uint8Array二进制数据,可以实时上传(发送)出去
//App中如果未配置Recorder.UniWithoutAppRenderjs时,建议提供此回调,因为录音结束后会将整个录音文件从renderjs传回逻辑层,由于uni-app的逻辑层和renderjs层数据交互性能实在太拉跨了,大点的文件传输会比较慢,提供此回调后可避免Stop时产生超大数据回传
//App中如果未配置RecordApp.UniWithoutAppRenderjs时,建议提供此回调,因为录音结束后会将整个录音文件从renderjs传回逻辑层,由于uni-app的逻辑层和renderjs层数据交互性能实在太拉跨了,大点的文件传输会比较慢,提供此回调后可避免Stop时产生超大数据回传
}
,takeoffEncodeChunk_renderjs:!this.takeoffEncodeChunkSet?null:`function(chunkBytes){
//App中这里可以做一些仅在renderjs中才生效的事情,不提供也行,this是renderjs模块的this(也可以用This变量)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ data() { return {} } //视图没有引用到的变量无需放data里,直接th

,takeoffEncodeChunk:true?null:(chunkBytes)=>{
//全平台通用:实时接收到编码器编码出来的音频片段数据,chunkBytes是Uint8Array二进制数据,可以实时上传(发送)出去
//App中如果未配置Recorder.UniWithoutAppRenderjs时,建议提供此回调,因为录音结束后会将整个录音文件从renderjs传回逻辑层,由于uni-app的逻辑层和renderjs层数据交互性能实在太拉跨了,大点的文件传输会比较慢,提供此回调后可避免Stop时产生超大数据回传
//App中如果未配置RecordApp.UniWithoutAppRenderjs时,建议提供此回调,因为录音结束后会将整个录音文件从renderjs传回逻辑层,由于uni-app的逻辑层和renderjs层数据交互性能实在太拉跨了,大点的文件传输会比较慢,提供此回调后可避免Stop时产生超大数据回传
}
,takeoffEncodeChunk_renderjs:true?null:`function(chunkBytes){
//App中这里可以做一些仅在renderjs中才生效的事情,不提供也行,this是renderjs模块的this(也可以用This变量)
Expand Down
31 changes: 31 additions & 0 deletions assets/手动测试脚本.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,34 @@ console.timeEnd(1);
crypto.subtle.digest("sha-1",pcm.buffer).then(v=>console.log(Array.from(new Uint8Array(v)).map(v=>("0"+v.toString(16)).substr(-2)).join("")))



【WebM长时间解析测试】
//Chrome 75.0.3770.100 64位 + Win7,未复现问题:录制超过1小时出现“WebM !Track4”错误消息
//进入代码运行页面,运行 实时转码并上传-mp3专版,先执行下面的代码
var TWebMBytes=new Uint8Array(50*1000*1000),TWebMOffset=0,TWebMIsEnd=false;
var TWebMAdd=function(bytes){
if(TWebMIsEnd)return;
if(TWebMOffset+bytes.length>TWebMBytes.length){
var len=~~(TWebMOffset/2);
var tmp=new Uint8Array(TWebMBytes.length);
tmp.set(TWebMBytes.subarray(TWebMOffset-len));
TWebMBytes=tmp;
TWebMOffset=len;
}
TWebMBytes.set(bytes,TWebMOffset);
TWebMOffset+=bytes.length;
};
var TWebMEnd=function(){
if(!TWebMIsEnd){
var bytes=TWebMBytes.slice(0,TWebMOffset);
var blob=new Blob([bytes.buffer]);
TWebMIsEnd=URL.createObjectURL(blob);
console.log(blob);
}
console.error(new Date().toLocaleString()+" 已抓取到WebM解析错误数据");
console.log(TWebMIsEnd);
};
//控制台源码中打开recorder-core.js
//在WebM_Extract中打断点,开头位置加上条件断点: TWebMAdd(inBytes);false
//在WebM_Extract中打断点,CLog("WebM !Track"位置加上条件断点: TWebMEnd();false

0 comments on commit 8748fa2

Please sign in to comment.