Skip to content

Commit

Permalink
修复IIRFilter一些情况下数值溢出产生爆音;ogg、amr编码器内置atob;小程序、uniapp的demo增加asr语音识别示例
Browse files Browse the repository at this point in the history
  • Loading branch information
xiangyuecn committed Dec 8, 2023
1 parent d4aa4cd commit 257fcaa
Show file tree
Hide file tree
Showing 44 changed files with 1,319 additions and 327 deletions.
5 changes: 2 additions & 3 deletions QuickStart.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<link rel="shortcut icon" type="image/png" href="assets/icon.png">

<title reclang="XvFp">Recorder H5 QuickStart: 快速入门</title>
<script>var PageLM="2023-12-01 20:16";</script>
<script>var PageLM="2023-12-08 20:41";</script>
<!--
你可以直接将 QuickStart.html 文件copy到你的(https)网站中,无需其他文件,就能正常开始测试了。
You can directly copy the QuickStart.html file to your (https) website, and you can start testing normally without other files.
Expand Down Expand Up @@ -40,8 +40,7 @@
if(DisableCDN)return;
clearTimeout(intBadCDN);
var cdn=useCDN.cdn;
var url=!cdn?"https://unpkg.com/recorder-core/":
/unpkg/i.test(cdn)?"https://xiangyuecn.gitee.io/recorder/":"";
var url=!cdn?"https://xiangyuecn.gitee.io/recorder/":"";
if(!url){ setCDNUrl(""); return;}
location.hash="#useCDN="+encodeURIComponent(JSON.stringify({
time:Date.now()
Expand Down
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ public void onPermissionRequest(PermissionRequest request) {
## 【附】iOS App - WebView中录音示例
在iOS App WebView中使用本库来录音,需要在App源码 `Info.plist` 中声明使用麦克风 `NSMicrophoneUsageDescription`,无需其他处理,WebView会自己处理好录音权限。

iOS 14.3+以上版本才支持WebView中进行H5录音;iOS 15+提供了静默授权支持,参考[WKUIDelegate](https://developer.apple.com/documentation/webkit/wkuidelegate)中的 `Requesting Permissions` -> `requestMediaCapturePermissionFor`,默认未实现,会导致WebView每次打开后第一次录音时均会弹出录音权限对话框
iOS 14.3+以上版本才支持WebView中进行H5录音;iOS 15+提供了静默授权支持,参考[WKUIDelegate](https://developer.apple.com/documentation/webkit/wkuidelegate)中的 `Requesting Permissions` -> `requestMediaCapturePermissionFor`,默认未实现,会导致WebView每次打开后第一次录音时、或长时间无操作再打开录音时均会弹出录音权限对话框

iOS 11.0-14.2:纯粹的H5录音在iOS WebView中是不支持的,需要有Native层的支持,具体参考RecordApp中的[app-support-sample/demo_ios](https://github.com/xiangyuecn/Recorder/tree/master/app-support-sample/demo_ios),含iOS App源码。

Expand All @@ -374,7 +374,7 @@ iOS 11.0-14.2:纯粹的H5录音在iOS WebView中是不支持的,需要有Nat
[](?)

## 【附】uni-app集成参考
`RecordApp`支持在uni-app中直接进行录音,支持编译成:H5、Android App、iOS App、微信小程序,请参考Demo项目和文档:[demo_UniApp](./app-support-sample/demo_UniApp)
`RecordApp`支持在uni-app中直接进行录音,支持编译成:H5、Android App、iOS App、微信小程序,请参考Demo项目和文档:[demo_UniApp](./app-support-sample/demo_UniApp),对应的组件可到[DCloud 插件市场下载](https://ext.dcloud.net.cn/plugin?name=Recorder-UniCore)

[不推荐] 如果仅使用`Recorder`的话,因为uni-app中的`renderjs`是直接运行在视图层WebView中的,因此可以通过在`renderjs`中加载Recorder来进行录音;此方法支持App、H5,但不支持小程序。同时需要注意在开发App平台的代码时,需在调用`rec.open`前,在原生层获取到录音权限;和上面的Android和iOS一样先配置好录音权限声明,再调用权限请求接口(iOS的WebView会自动处理可以不请求),在逻辑层中编写js权限处理代码。

Expand Down Expand Up @@ -411,7 +411,7 @@ iOS 11.0-14.2:纯粹的H5录音在iOS WebView中是不支持的,需要有Nat

**留意中途来电话**:在移动端录音时,如果录音中途来电话,或者通话过程中打开录音,是不一定能进行录音的;经过简单测试发现,iOS上Safari将暂停返回音频数据,直到通话结束才开始继续有音频数据返回;小米上Chrome不管是来电还是通话中开始录音都能对麦克风输入的声音进行录音;只是简单测试,更多机器和浏览器并未做测试,不过整体上来看来电话或通话中进行录音的可行性并不理想,也不赞成在这种过程中进行录音;但只要通话结束后录音还是会正常进行,影响基本不大。

**录音时对播放音频的影响**:仅在移动端,如果录音配置中未禁用降噪+回声消除(浏览器默认开启降噪+回声),打开录音后,如果同时播放音频,此时系统播放音量可能会变得很小;PC上 和 禁用降噪+回声消除后 似乎无此影响,但iOS上如果禁用又可能会导致无法正常录音,详细请阅读配置文档中的`audioTrackSet`参数说明。
**录音时对播放音频的影响**:仅在移动端,如果录音配置中未禁用降噪+回声消除(浏览器默认开启降噪+回声),打开录音后,如果同时播放音频,此时系统播放音量可能会变得很小,关闭录音后一般可恢复音量;PC上 和 禁用降噪+回声消除后 似乎无此影响,但iOS上如果禁用又可能会导致无法正常录音,详细请阅读配置文档中的`audioTrackSet`参数说明。

**移动端锁屏录音**:手机锁屏后浏览器的运行状态是一个玄学,是否能录音不可控;不同手机、甚至同一手机在不同状态下,有可能能录又有可能不能录,且无法检测;可以调用 `navigator.wakeLock` 来阻止手机自动锁屏,不支持的直接简单粗暴的 循环+静音 播放一段视频,来阻止锁屏,就是有点费电,具体实现可参考H5在线测试页面内的`wakeLockClick`方法。

Expand All @@ -425,6 +425,8 @@ iOS 11.0-14.2:纯粹的H5录音在iOS WebView中是不支持的,需要有Nat

> 此处已清除7个已知问题,大部分无法解决的问题会随着时间消失;问题主要集中在iOS部分版本上(不同系统版本问题不重样),好在这玩意能更新
*2023-12-06* iOS上反复弹出的权限弹框:据QQ群内`1806152243`开发者反馈,进入页面打开一次录音并关闭后,如果没有在页面上进行任何用户交互操作(点击、触摸、滑动等),大约35秒左右之后,重新打开录音时,浏览器将会再次弹出录音权限对话框;iOS Safari上稳定复现;这是浏览器自己的行为,js无法控制,设计交互逻辑时应当注意。

*2023-02-22* iPhone 14:~~有部分开发者反馈iPhone14上关闭录音后再次打开录音,会出现无法录音的情况,目前并不清楚是只有iPhone14上有问题,还是iOS16均有问题;估计是新的WebKit改了相关源码印度阿三没有测试,js没办法解决此问题,静候iOS更新,也许下一个系统更新就自动修复了;建议针对iOS环境,全局只open一次,不要close,挂在那里录音,可减少iOS系统问题带来的影响(负优化+耗电)。~~ 2023-7-1,此问题已修复,原因出在AudioContext上,iOS新版本上似乎不能共用一个AudioContext(新版本每次open均会创建新的AudioContext),并且iOS上AudioContext的resume行为和其他浏览器不相同,如果不是通过用户操作(触摸、点击等)进行调用,将无法resume,参考 [ztest_AudioContext_resume.html](https://xiangyuecn.gitee.io/recorder/assets/ztest_AudioContext_resume.html) 测试用例。

*2020-04-26* Safari Bug:据QQ群内`1048506792``190451148`开发者反馈研究发现,IOS ?-13.X Safari内打开录音后,如果切换到了其他标签、或其他App并且播放了任何声音,此时将会中断已打开的录音(系统级的?),切换回正在录音的页面,这个页面的录音功能将会彻底失效,并且刷新也无法恢复录音;表现为关闭录音后再次打开录音,能够正常获得权限,但浏览器返回的采集到的音频为静默的PCM,此时地址栏也并未显示出麦克风图标,刷新这个标签也也是一样不能正常获得录音,只有关掉此标签新打开页面才可正常录音。如果打开录音后关闭了录音,然后切换到其他标签或App播放声音,然后返回录音页面,不会出现此问题。此为Safari的底层Bug。使用长按录音类似的用户交互可大幅度避免踩到这坨翔。
Expand Down Expand Up @@ -724,7 +726,7 @@ mockRec.stop(function(blob,duration){


### 【静态方法】Recorder.IIRFilter(useLowPass,sampleRate,freq)
IIR低通、高通滤波;可重新赋值一个函数,来改变Recorder的默认行为,比如SampleData中的低通滤波。返回的是一个函数,用此函数对pcm的每个采样值按顺序进行处理即可(不同pcm不可共用)。
IIR低通、高通滤波;可重新赋值一个函数,来改变Recorder的默认行为,比如SampleData中的低通滤波。返回的是一个函数,用此函数对pcm的每个采样值按顺序进行处理即可(不同pcm不可共用);注意此函数返回值可能会越界超过Int16范围,自行限制一下即可:Math.min(Math.max(val,-0x8000),0x7FFF)

`useLowPass`: true或false,true为低通滤波,false为高通滤波

Expand Down Expand Up @@ -1104,6 +1106,7 @@ var asr=Recorder.ASR_Aliyun_Short({
onclose:fn({code, reason}) 连接关闭回调
onmessage:fn({data}) 收到消息回调
connect:fn() 进行连接
close:fn(code,reason) 关闭连接
send:fn(data) 发送数据,data为字符串或者arraybuffer
}
binaryType固定使用arraybuffer类型
Expand Down
5 changes: 2 additions & 3 deletions app-support-sample/QuickStart.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<link rel="shortcut icon" type="image/png" href="../assets/icon.png">

<title reclang="CS4l">RecordApp QuickStart: 快速入门</title>
<script>var PageLM="2023-12-01 20:16";</script>
<script>var PageLM="2023-12-08 20:41";</script>
<!--
你可以直接将 /app-support-sample/QuickStart.html 文件copy到你的(https)网站中,无需其他文件,就能正常开始测试了。
You can directly copy the /app-support-sample/QuickStart.html file to your (https) website, and you can start testing normally without other files.
Expand Down Expand Up @@ -40,8 +40,7 @@
if(DisableCDN)return;
clearTimeout(intBadCDN);
var cdn=useCDN.cdn;
var url=!cdn?"https://unpkg.com/recorder-core/":
/unpkg/i.test(cdn)?"https://xiangyuecn.gitee.io/recorder/":"";
var url=!cdn?"https://xiangyuecn.gitee.io/recorder/":"";
if(!url){ setCDNUrl(""); return;}
location.hash="#useCDN="+encodeURIComponent(JSON.stringify({
time:Date.now()
Expand Down
6 changes: 3 additions & 3 deletions app-support-sample/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ import './你copy的目录/native-config.js' //你需要将 /app-support-sample/
```

### 在微信小程序中使用
请直接参考本目录下的 [miniProgram-wx](./miniProgram-wx) 小程序demo项目。
请直接参考本目录下的 [miniProgram-wx](./miniProgram-wx) 小程序demo项目;如果是在小程序`web-view`中录音请直接使用`Recorder H5`就行,不需要额外支持

``` javascript
//微信开发者工具对npm支持太差,因此最好直接git clone源码使用
Expand Down Expand Up @@ -246,7 +246,7 @@ public void onPermissionRequest(PermissionRequest request) {
### iOS App录音权限
在iOS App WebView中使用本库来录音,需要在App源码 `Info.plist` 中声明使用麦克风 `NSMicrophoneUsageDescription`,无需其他处理,WebView会自己处理好录音权限。

iOS 14.3+以上版本才支持WebView中进行H5录音;iOS 15+提供了静默授权支持,参考[WKUIDelegate](https://developer.apple.com/documentation/webkit/wkuidelegate)中的 `Requesting Permissions` -> `requestMediaCapturePermissionFor`,默认未实现,会导致WebView每次打开后第一次录音时均会弹出录音权限对话框
iOS 14.3+以上版本才支持WebView中进行H5录音;iOS 15+提供了静默授权支持,参考[WKUIDelegate](https://developer.apple.com/documentation/webkit/wkuidelegate)中的 `Requesting Permissions` -> `requestMediaCapturePermissionFor`,默认未实现,会导致WebView每次打开后第一次录音时、或长时间无操作再打开录音时均会弹出录音权限对话框

iOS 11.0-14.2:纯粹的H5录音在iOS WebView中是不支持的,需要有Native层原生录音的支持,具体参考 [demo_ios](https://github.com/xiangyuecn/Recorder/tree/master/app-support-sample/demo_ios) 目录,含iOS App源码。

Expand Down Expand Up @@ -449,7 +449,7 @@ JsBridge可以是自己实现的交互方式 或 别人提供的框架。因为
[](?)

## 微信小程序:app-miniProgram-wx-support.js
[app-miniProgram-wx-support.js](../src/app-support/app-miniProgram-wx-support.js) 是微信小程序支持文件,支持在微信小程序环境中使用;使用请参考本目录内的 [miniProgram-wx](./miniProgram-wx) 小程序demo项目。
[app-miniProgram-wx-support.js](../src/app-support/app-miniProgram-wx-support.js) 是微信小程序支持文件,支持在微信小程序环境中使用;使用请参考本目录内的 [miniProgram-wx](./miniProgram-wx) 小程序demo项目;如果是在小程序`web-view`中录音请直接使用`Recorder H5`就行,不需要额外支持

录音功能由微信小程序的RecorderManager录音接口提供(已屏蔽10分钟录音限制),因为js层已加载Recorder和相应的js编码引擎,所以,Recorder支持的录音格式,小程序内均可以做到支持。

Expand Down
2 changes: 1 addition & 1 deletion app-support-sample/demo_UniApp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ data() { return {} } //视图没有引用到的变量无需放data里,直接th
1. 默认未配置`RecordApp.UniNativeUtsPlugin`(未使用原生录音插件和uts插件)时,会在renderjs中使用Recorder H5进行录音,录音数据会实时回传到逻辑层。
2. 配置了`RecordApp.UniNativeUtsPlugin`使用原生录音插件或uts插件时,会直接调用原生插件进行录音;录音数据默认会传递到renderjs中进行音频编码处理(WebWorker加速),然后再实时回传到逻辑层,如果配置了`RecordApp.UniWithoutAppRenderjs=true`时,音频编码处理将会在逻辑层中直接处理。

**当App是在renderjs中使用H5进行录音时(未使用原生录音插件和uts插件),iOS上只支持14.3以上版本,且iOS上每次进入页面后第一次请求录音权限时WebView均会弹出录音权限对话框,不同旧iOS版本(低于iOS17)下H5录音可能存在的问题在App中同样会存在;使用配套的原生录音插件或uts插件时无以上问题和版本限制(uts插件开发中暂不可用),Android也无以上问题。**
**当App是在renderjs中使用H5进行录音时(未使用原生录音插件和uts插件),iOS上只支持14.3以上版本,且iOS上每次进入页面后第一次请求录音权限时、或长时间无操作再请求录音权限时WebView均会弹出录音权限对话框,不同旧iOS版本(低于iOS17)下H5录音可能存在的问题在App中同样会存在;使用配套的原生录音插件或uts插件时无以上问题和版本限制(uts插件开发中暂不可用),Android也无以上问题。**

**当音频编码是在renderjs中进行处理时,录音结束后会将整个录音文件传回逻辑层,由于uni-app的逻辑层和renderjs层数据交互性能实在太拉跨了,大点的文件传输会比较慢,建议Start时使用takeoffEncodeChunk实时获取音频文件数据可避免Stop时产生超大数据回传;配置了`RecordApp.UniWithoutAppRenderjs=true`后,因为音频编码直接是在逻辑层中进行,将不存在传输性能损耗,但会影响逻辑层的性能(正常情况轻微不明显),需要配套使用原生录音插件才可以进行此项配置。**

Expand Down
Loading

0 comments on commit 257fcaa

Please sign in to comment.