From ac2e44003a7019c6f4a3655ae44b5dd10ac00f35 Mon Sep 17 00:00:00 2001 From: xiangyuecn <753610399@qq.com> Date: Fri, 12 Jul 2024 10:25:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0demo=E5=92=8C=E6=96=87?= =?UTF-8?q?=E6=A1=A3=20-=20=E5=9C=A8=E7=BA=BF=E6=B5=8B=E8=AF=95=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=B7=BB=E5=8A=A0=E5=AE=9E=E6=97=B6=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E9=80=9A=E8=AF=9D=E8=81=8A=E5=A4=A9=E5=AF=B9=E8=AE=B2=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E5=8A=9F=E8=83=BD=20-=20=E5=B0=8F=E7=A8=8B=E5=BA=8Fde?= =?UTF-8?q?mo=E6=B7=BB=E5=8A=A0=E5=BD=95=E9=9F=B3=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E3=80=81=E5=AE=9E=E6=97=B6=E8=AF=AD=E9=9F=B3=E9=80=9A=E8=AF=9D?= =?UTF-8?q?=E8=81=8A=E5=A4=A9=E5=AF=B9=E8=AE=B2=E6=B5=8B=E8=AF=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20-=20App=E5=8E=9F=E7=94=9F=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=8Cgitee.io=E6=8D=A2=E6=88=90github.io?= =?UTF-8?q?=EF=BC=8CAndroid=E9=87=8D=E6=96=B0=E6=89=93=E5=8C=85apk?= =?UTF-8?q?=EF=BC=8CiOS=E5=BC=83=E7=94=A8AVAudioRecorder=E6=94=B9=E7=94=A8?= =?UTF-8?q?AudioUnit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 45 +- app-support-sample/demo_UniApp/README.md | 13 +- .../pages/recTest/main_recTest.vue | 2 +- .../pages/recTest/test_realtime_voice.vue | 12 +- .../uni_modules/Recorder-UniCore/readme.md | 4 +- .../demo_android/app-debug.apk.zip | Bin 43173 -> 43179 bytes .../xianyuecn/recorder/MainActivity.java | 2 +- .../xianyuecn/recorder/RecordAppJsBridge.java | 2 +- app-support-sample/demo_ios/README.md | 8 +- .../demo_ios/recorder/MainView.swift | 2 +- .../demo_ios/recorder/RecordAppJsBridge.swift | 224 +++--- app-support-sample/index.html | 144 +++- app-support-sample/miniProgram-wx/README.md | 2 +- .../miniProgram-wx/pages/recTest/recTest.js | 44 +- .../miniProgram-wx/pages/recTest/recTest.json | 2 + .../miniProgram-wx/pages/recTest/recTest.wxml | 15 + .../test_realtime_voice__.js | 455 +++++++++++++ .../test_realtime_voice__.json | 4 + .../test_realtime_voice__.wxml | 45 ++ .../test_realtime_voice__.wxss | 1 + .../test_upload_saveFile__.js | 153 +++++ .../test_upload_saveFile__.json | 4 + .../test_upload_saveFile__.wxml | 18 + .../test_upload_saveFile__.wxss | 1 + .../miniProgram-wx/project.config.json | 58 +- assets/page-i18n/QuickStart_html/en-US.js | 4 - assets/page-i18n/app_QuickStart_html/en-US.js | 4 - assets/page-i18n/app_index_html/en-US.js | 72 +- assets/page-i18n/index_html/en-US.js | 16 +- assets/runtime-codes/lib.js-binary-bytes.js | 8 + assets/use_webrtc.png | Bin 163348 -> 52558 bytes assets/zdemo.index.realtime_voice.js | 635 ++++++++++++++++++ assets/zdemo.index.webrtc.js | 60 +- .../ztext_collab-project_videojs-record.html | 2 +- index.html | 100 ++- 35 files changed, 1921 insertions(+), 240 deletions(-) create mode 100644 app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.js create mode 100644 app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.json create mode 100644 app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.wxml create mode 100644 app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.wxss create mode 100644 app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.js create mode 100644 app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.json create mode 100644 app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.wxml create mode 100644 app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.wxss create mode 100644 assets/zdemo.index.realtime_voice.js diff --git a/README.md b/README.md index 6c9b9b7a..2d7bf0a0 100644 --- a/README.md +++ b/README.md @@ -308,6 +308,35 @@ $.ajax({ ``` +[​](?) + +## 【附】js中的二进制基础知识:Uint8Array Int16Array ArrayBuffer Blob/File +更多js二进制数据基础知识请阅读:[js二进制转换-Base64/Hex/Int16Array/ArrayBuffer/Blob](https://xiangyuecn.github.io/Recorder/assets/工具-代码运行和静态分发Runtime.html?jsname=lib.js-binary-bytes) +``` javascript +//XMLHttpRequest、WebSocket等一般都能直接send(TypedArray/ArrayBuffer/Blob)到服务器,服务器会收到二进制数据 +//TypedArray/ArrayBuffer在绝大部分js运行环境中都支持,Blob只在浏览器中支持 + +//Recorder的buffers是pcm数组,单个pcm是Int16Array(TypedArray子类) +var arrayBuffer=pcm.buffer; //pcm的Int16Array转ArrayBuffer +var pcm=new Int16Array(arrayBuffer); //pcm的ArrayBuffer转成Int16Array(共享内存,arrayBuffer.slice(0)截取新的不共享) + +//Recorder的takeoffEncodeChunk得到的chunkBytes是Uint8Array(TypedArray子类,类似于无符号byte[]) +var arrayBuffer=chunkBytes.buffer; //chunkBytes的Uint8Array转ArrayBuffer +var chunkBytes=new Uint8Array(arrayBuffer); //任意ArrayBuffer均能转成Uint8Array + +//ArrayBuffer 与 Blob/File 可以相互转换,File是Blob的一个特例(子类) +var blob=new Blob([arrayBuffer],{type:"audio/mp3"}); +var file=new File([arrayBuffer],"xxx.mp3"); +var arrayBuffer=reader.result; //用FileReader的readAsArrayBuffer方法读取 Blob/File 成ArrayBuffer + +//二进制拼接合并,下面Int16Array换成Uint8Array等其他TypedArray也是一样的 +var pcm1=new Int16Array([1,2]),pcm2=new Int16Array([3,4,5,6]); +var pcm=new Int16Array(pcm1.length+pcm2.length); +pcm.set(pcm1,0); //写入pcm1到开头位置 +pcm.set(pcm2,pcm1.length); //写入pcm2到pcm1后面,完成拼接 +``` + + @@ -1516,15 +1545,23 @@ $T.G("key-xx2",["v1"], "ru"); //明确返回俄语,不管当前lang设置的 # :open_book:其它功能介绍 -## 语音通话聊天demo:实时编码、传输与播放验证 -在[线测试Demo](https://xiangyuecn.github.io/Recorder/)中包含了一个语音通话聊天的测试功能,没有服务器支持所以仅支持局域网内一对一语音。用两个设备(浏览器打开两个标签也可以)打开demo,勾选H5版语音通话聊天,按提示交换两个设备的信息即可成功进行P2P连接,然后进行语音。实际使用时数据传输可以用WebSocket,会简单好多。 +## 测试用的本地服务器 +在 [/assets/node-localServer](./assets/node-localServer) 目录内提供了一个nodejs服务,实现了http上传接口、websocket接口。多个demo中有使用到,方便测试。 -编写本语音测试的目的在于验证H5录音实时转码、传输的可行性,并验证实时转码mp3格式小片段文件接收后的可播放性。经测试发现:除了移动端可能存在设备性能低下的问题以外,录音后实时转码mp3并传输给对方是可行的,对方接收后播放也能连贯的播放(效果还是要看播放代码写的怎么样,目前没有比较完美的播放代码,用BufferStreamPlayer插件播放效果会好点)。另外(16kbps,16khz)MP3开语音15分钟大概3M的流量,wav、pcm 15分钟要37M多流量。 +## WebSocket语音通话聊天demo +在[线测试Demo](https://xiangyuecn.github.io/Recorder/)中包含了一个WebSocket版的语音通话聊天的测试功能,测试时需先运行上面这个本地服务器。用两个设备(浏览器打开两个标签也可以)打开demo,勾选实时语音通话聊天对讲,配置好双方标识,连接上服务器即可通话和聊天。手机上测试时,应当使用wss连接,本地服务器里面配置上ssl证书开启wss。 -另外除wav、pcm外MP3等格式编码出来的音频的播放时间比PCM原始数据要长一些或短一些,如果涉及到解码或拼接时,这个地方需要注意(如果类型支持,实时处理时使用`takeoffEncodeChunk`选项可完全避免此问题)。 +对应的源码在 [/assets/zdemo.index.realtime_voice.js](./assets/zdemo.index.realtime_voice.js),实时传输pcm格式的音频数据(未经过任何编码),用BufferStreamPlayer插件播放。 ![](assets/use_webrtc.png) +## WebRTC语音通话聊天demo +在[线测试Demo](https://xiangyuecn.github.io/Recorder/)中还包含了一个WebRTC版的语音通话聊天的测试功能,支持局域网内一对一语音无需服务器。用两个设备(浏览器打开两个标签也可以)打开demo,勾选实时语音通话聊天对讲再切换到WebRTC,按提示交换两个设备的信息即可成功进行P2P连接,然后进行语音。实际使用时数据传输用WebSocket的会简单好多。 + +早期编写本语音测试的目的在于验证H5录音实时转码、传输的可行性,并验证实时转码mp3格式小片段文件接收后的可播放性。经测试发现:除了移动端可能存在设备性能低下的问题以外,录音后实时转码mp3并传输给对方是可行的,对方接收后播放也能连贯的播放(效果还是要看播放代码写的怎么样,目前没有比较完美的播放代码,用BufferStreamPlayer插件播放效果会好点)。另外(16kbps,16khz)MP3开语音15分钟大概3M的流量,wav、pcm 15分钟要37M多流量。 + +另外除wav、pcm外MP3等格式编码出来的音频的播放时间比PCM原始数据要长一些或短一些,如果涉及到解码或拼接时,这个地方需要注意(如果类型支持,实时处理时使用`takeoffEncodeChunk`选项可完全避免此问题)。 + diff --git a/app-support-sample/demo_UniApp/README.md b/app-support-sample/demo_UniApp/README.md index 7ab94e81..f37b4be1 100644 --- a/app-support-sample/demo_UniApp/README.md +++ b/app-support-sample/demo_UniApp/README.md @@ -8,7 +8,7 @@ - 支持编译成:H5、Android App、iOS App、微信小程序 - 支持已有的大部分录音格式:mp3、wav、pcm、amr、ogg、g711a、g711u等 - 支持实时处理,包括变速变调、实时上传、ASR语音转文字 -- 支持可视化波形显示;可配置回声消除、降噪;注意:不支持通话时录音 +- 支持可视化波形显示;可配置回声消除、降噪;**注意:不支持通话时录音** - 支持离线使用,本组件和配套原生插件均不依赖网络 - App端有配套的[原生录音插件](https://ext.dcloud.net.cn/plugin?name=Recorder-NativePlugin)可供搭配使用,兼容性和体验更好 @@ -326,7 +326,7 @@ RecordApp.Start({ ,android_audioSource:7 //提供此配置时优先级比audioTrackSet更高,默认值为0 //iOS的AVAudioSession setCategory的withOptions参数值(App搭配原生插件可用),取值请参考本文档下面的iosSetDefault_categoryOptions - //,ios_categoryOptions:0x1|0x4|0x8 //0x8是外放,默认值为0x1|0x4不带0x8是听筒播放,等同于下面的setSpeakerOff + //,ios_categoryOptions:0x1|0x4 //默认值为5(0x1|0x4) }); //App搭配原生插件时尝试切换听筒播放或外放 @@ -584,12 +584,17 @@ getInfo 获取插件信息 返回:{ info:"" } //插件信息字符串 setSpeakerOff 切换扬声器外放和听筒播放,随时都可以调用;但需注意打开录音时可能会自动切换播放方式,因此在打开录音后需要明确调用一次切换成你需要的播放方式 - 参数:{ off:true } //必填,true听筒播放,false扬声器播放 + 参数:{ + off:true //必填,true听筒播放,false扬声器播放,连接耳机时此配置无效 + headset:true //选填,默认true耳机播放,false扬声器播放(同时使用手机上的麦克风),连接耳机时此配置生效 + //配置场景:当由代码进行主动调用,比如开启回声消除录音时想播放的声音大点,就只提供off:false,这时没连接耳机会从扬声器播放,有耳机就从耳机播放 + //配置场景:当类似由用户点击外放按钮时调用,同时提供off:false+headset:false,这时不管有没有耳机,都会从扬声器播放 + } 返回:{ } //空对象 iosSetDefault_categoryOptions iOS设置默认值,Android不可调用,为iOS的AVAudioSession setCategory的withOptions参数值;RecordApp.Start开始录音时如果未提供ios_categoryOptions参数,将会使用此默认值,提供了时将赋值给此默认值;setSpeakerOff调用时也会使用到此默认值 参数:{ - value:0x1|0x4|0x8 //必填,0x8是外放,默认不带0x8是听筒播放,取值(多选,默认 0x1|0x4):0 什么也不设置,0x1 MixWithOthers,0x2 DuckOthers,0x4 AllowBluetooth,0x8 DefaultToSpeaker,0x11 InterruptSpokenAudioAndMixWithOthers,0x20 AllowBluetoothA2DP,0x40 AllowAirPlay,0x80 OverrideMutedMicrophoneInterruption + value:0x1|0x4 //必填,取值(多选,默认值5=0x1|0x4):0 什么也不设置,0x1 MixWithOthers,0x2 DuckOthers,0x4 AllowBluetooth,0x8 DefaultToSpeaker(不可用,通过setSpeakerOff来切换),0x11 InterruptSpokenAudioAndMixWithOthers,0x20 AllowBluetoothA2DP,0x40 AllowAirPlay,0x80 OverrideMutedMicrophoneInterruption } 返回:{ } //空对象 diff --git a/app-support-sample/demo_UniApp/pages/recTest/main_recTest.vue b/app-support-sample/demo_UniApp/pages/recTest/main_recTest.vue index a7602603..a313eb4f 100644 --- a/app-support-sample/demo_UniApp/pages/recTest/main_recTest.vue +++ b/app-support-sample/demo_UniApp/pages/recTest/main_recTest.vue @@ -688,7 +688,7 @@ export default { } ,__setSpeakerOff(off){ // #ifdef APP - RecordApp.UniNativeUtsPluginCallAsync("setSpeakerOff",{off:off}).then(()=>{ + RecordApp.UniNativeUtsPluginCallAsync("setSpeakerOff",{off:off,headset:off}).then(()=>{ this.reclog("已切换成"+(off?"听筒播放":"外放"),2); }).catch((e)=>{ this.reclog("切换"+(off?"听筒播放":"外放")+"失败:"+e.message,1); diff --git a/app-support-sample/demo_UniApp/pages/recTest/test_realtime_voice.vue b/app-support-sample/demo_UniApp/pages/recTest/test_realtime_voice.vue index f59faeb5..3e110aa1 100644 --- a/app-support-sample/demo_UniApp/pages/recTest/test_realtime_voice.vue +++ b/app-support-sample/demo_UniApp/pages/recTest/test_realtime_voice.vue @@ -137,10 +137,10 @@ export default { this.socketIsOpen=false; this.log("ws已断开"); }); - this.socket.onError(()=>{ + this.socket.onError((e)=>{ if(sid!=this.SID) return; this.socketIsOpen=false; - this.log("ws因为错误已断开",1); + this.log("ws因为错误已断开:"+e.errMsg,1); }); this.socket.onOpen(()=>{ if(sid!=this.SID) return; @@ -469,8 +469,11 @@ export default { } //微信环境,单独创建播放器 ,initWxStreamPlay(){ - if(this.spWxCtx && this.spWxCtx.state=="running") return; - if(this.spWxCtx) this.spWxCtx.close(); + if(this.spWxCtx && this.spWxCtx.state=="running") return; + if(this.spWxCtx){ + if(Date.now()-this.spWxCtx.__time<2000) return;//wait running + this.spWxCtx.close(); + }; var playBuffers=[], playBufferLen=0; this.addWxPlayBuffer=(pcm)=>{ playBuffers.push(pcm); @@ -483,6 +486,7 @@ export default { this.log("微信版本太低,无法创建WebAudioContext",1); return; } + this.spWxCtx.__time=Date.now(); this.log("微信streamPlay已打开(播放效果一般,听个响)",2); if(this.spWxTimer)clearInterval(this.spWxTimer); diff --git a/app-support-sample/demo_UniApp/uni_modules/Recorder-UniCore/readme.md b/app-support-sample/demo_UniApp/uni_modules/Recorder-UniCore/readme.md index 8d8aa3c3..6cac3192 100644 --- a/app-support-sample/demo_UniApp/uni_modules/Recorder-UniCore/readme.md +++ b/app-support-sample/demo_UniApp/uni_modules/Recorder-UniCore/readme.md @@ -10,7 +10,7 @@ - 支持编译成:H5、Android App、iOS App、微信小程序 - 支持已有的大部分录音格式:mp3、wav、pcm、amr、ogg、g711a、g711u等 - 支持实时处理,包括变速变调、实时上传、ASR语音转文字 -- 支持可视化波形显示;可配置回声消除、降噪;注意:不支持通话时录音 +- 支持可视化波形显示;可配置回声消除、降噪;**注意:不支持通话时录音** - 支持离线使用,本组件和配套原生插件均不依赖网络 - App端有配套的[原生录音插件](https://ext.dcloud.net.cn/plugin?name=Recorder-NativePlugin)可供搭配使用,兼容性和体验更好 @@ -319,7 +319,7 @@ RecordApp.Start({ ,android_audioSource:7 //提供此配置时优先级比audioTrackSet更高,默认值为0 //iOS的AVAudioSession setCategory的withOptions参数值(App搭配原生插件可用),取值请参考配套原生插件文档中的iosSetDefault_categoryOptions - //,ios_categoryOptions:0x1|0x4|0x8 //0x8是外放,默认值为0x1|0x4不带0x8是听筒播放,等同于下面的setSpeakerOff + //,ios_categoryOptions:0x1|0x4 //默认值为5(0x1|0x4) }); //App搭配原生插件时尝试切换听筒播放或外放 diff --git a/app-support-sample/demo_android/app-debug.apk.zip b/app-support-sample/demo_android/app-debug.apk.zip index 4568402a4cf0da3a5325ae45375cf05bbc668b5a..13da153302b20d37fbd92def3307a85b1af62132 100644 GIT binary patch delta 19334 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 jI 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 早期版本(2020-11-17)接口对应的方法使用的`AVAudioRecorder`来录音,`AVAudioRecorder`会把录音PCM数据写入到文件,因此我们实时从这个文件中读取出数据,然后定时调用`AppJsBridgeRequest.Record`把数据返回给js端即可完成完整的录音功能;可能是因为`AVAudioRecorder`存在文件写入缓存的原因,数据并非实时的flush到文件的,因此实时发送给js的数据存在300ms左右的滞后,没有AudioUnit的好使。 ## 需要权限 diff --git a/app-support-sample/demo_ios/recorder/MainView.swift b/app-support-sample/demo_ios/recorder/MainView.swift index aafe55fd..4ad10db4 100644 --- a/app-support-sample/demo_ios/recorder/MainView.swift +++ b/app-support-sample/demo_ios/recorder/MainView.swift @@ -62,7 +62,7 @@ class MainView: UIViewController { webView.uiDelegate = webUI; webView.navigationDelegate = webNav; - let url="https://xiangyuecn.gitee.io/recorder/app-support-sample/"; + let url="https://xiangyuecn.github.io/Recorder/app-support-sample/"; webView.load(URLRequest(url: URL(string: url)!)); diff --git a/app-support-sample/demo_ios/recorder/RecordAppJsBridge.swift b/app-support-sample/demo_ios/recorder/RecordAppJsBridge.swift index 2b461c0d..606454b2 100644 --- a/app-support-sample/demo_ios/recorder/RecordAppJsBridge.swift +++ b/app-support-sample/demo_ios/recorder/RecordAppJsBridge.swift @@ -17,9 +17,6 @@ public class RecordAppJsBridge { static private let JsBridgeName="RecordAppJsBridge"; static private let JsRequestName="AppJsBridgeRequest"; - //默认会把录音数据额外存储到app的cache目录中,仅供分析调试之用 - static private let SavePCM_ToLogFile=true; - static private let LogTag="RecordAppJsBridge"; public typealias MicrophoneUsesPermission = (@escaping (Bool)->Void)->Void; @@ -331,42 +328,69 @@ return [ self.main=main_; sampleRate=sampleRateReq; - logData=RecordAppJsBridge.SavePCM_ToLogFile; - if logData { - logStreamFull=NSMutableData(); - } RecordApis.Current=self; - cacheFile=NSTemporaryDirectory() + "/record.tmp.pcm" - try? FileManager.default.removeItem(atPath: cacheFile); - let session = AVAudioSession.sharedInstance() do { - try session.setCategory(AVAudioSession.Category.playAndRecord) - try session.setActive(true) + try session.setCategory(AVAudioSession.Category.playAndRecord, options:[.mixWithOthers, .allowBluetooth]); + //try session.setPreferredIOBufferDuration(0.093); //指定录音帧时长,会导致蓝牙耳机录音不正常,0.005正常 + try session.setActive(true); + SessionActive=true; } catch let err { main.Log.e(RecordApis.LogTag, "设置录音环境出错:"+err.localizedDescription); ready("设置录音环境出错:"+err.localizedDescription); return; } - let sets: [String: Any] = [ - AVSampleRateKey: NSNumber(value: sampleRate),//采样率 - AVFormatIDKey: NSNumber(value: kAudioFormatLinearPCM),//音频格式 - AVLinearPCMBitDepthKey: NSNumber(value: 16),//采样位数 - AVNumberOfChannelsKey: NSNumber(value: 1),//通道数 - AVEncoderAudioQualityKey: NSNumber(value: AVAudioQuality.high.rawValue)//录音质量 - ]; - //开始录音 - do { - let url = URL(fileURLWithPath: cacheFile) - rec = try AVAudioRecorder.init(url: url, settings: sets) - rec.prepareToRecord() - rec.record() - } catch let err { - main.Log.e(RecordApis.LogTag, "开始录音出错:"+err.localizedDescription); - ready("开始录音出错:"+err.localizedDescription); + //初始化AudioUnit + var aDesc=AudioComponentDescription(); + aDesc.componentType = kAudioUnitType_Output; + aDesc.componentSubType = kAudioUnitSubType_RemoteIO; //kAudioUnitSubType_VoiceProcessingIO 回声消除AEC + aDesc.componentManufacturer = kAudioUnitManufacturer_Apple; + aDesc.componentFlags = 0; + aDesc.componentFlagsMask = 0; + let aComp = AudioComponentFindNext(nil, &aDesc); + var aState = AudioComponentInstanceNew(aComp!, &AUnit); + if(aState == 0){ + //打开音频输入 + var enableFlag: UInt32 = 1; + aState=AudioUnitSetProperty(AUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enableFlag, UInt32(MemoryLayout.size)) + } + if(aState == 0){ + //音频参数 + var aFormat=AudioStreamBasicDescription(); + aFormat.mSampleRate = Double(sampleRate); + aFormat.mFormatID = kAudioFormatLinearPCM; + aFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; + aFormat.mChannelsPerFrame = 1;//单声道 + aFormat.mBitsPerChannel = 16;//16位 + aFormat.mFramesPerPacket = 1;//每个包有多少帧 + aFormat.mBytesPerFrame = 2;//每一帧有多少字节 + aFormat.mBytesPerPacket = 2;//每一包有多少字节 + aState = AudioUnitSetProperty(AUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &aFormat, UInt32(MemoryLayout.size)); + if(aState==0){ + aState = AudioUnitSetProperty(AUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &aFormat, UInt32(MemoryLayout.size)); + } + } + if(aState == 0){ + //音频数据回调 + var aCB = AURenderCallbackStruct( + inputProc: self.onRecFrame, + inputProcRefCon: UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()) + ); + aState = AudioUnitSetProperty(AUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Output, 0, &aCB, UInt32(MemoryLayout.size)); + } + if(aState == 0){ + //开始录音 + aState = AudioUnitInitialize(AUnit); + if(aState==0){ + aState = AudioOutputUnitStart(AUnit); + } + } + if(!(aState==0)){ + main.Log.e(RecordApis.LogTag, "初始化AudioUnit出错["+String(aState)+"]"); + ready("初始化AudioUnit出错["+String(aState)+"]"); return; } @@ -376,23 +400,15 @@ return [ alive(); main.Log.i(RecordApis.LogTag, "开始录音:"+String(sampleRate)); startTime=Code.GetMS(); - - ThreadX.Run { - self.readAsync(); - } } private var main:RecordAppJsBridge!; private var sampleRate:Int; - private var rec:AVAudioRecorder!; + private var AUnit:AudioComponentInstance!; + private var SessionActive=false; private var isRec=false; private var aliveInt=0; private var startTime=Int64(0); - private var cacheFile:String!; - - private var logData:Bool; - private var logStreamFull:NSMutableData!; - private func destroy(){ objc_sync_enter(Lock); defer{ @@ -406,11 +422,15 @@ return [ ThreadX.ClearTimeout(aliveInt); - logStreamFull=nil; - - if(rec != nil){ - rec.stop(); - rec=nil; + if(AUnit != nil){ + AudioOutputUnitStop(AUnit); + AudioUnitUninitialize(AUnit); + AudioComponentInstanceDispose(AUnit); + AUnit=nil; + } + if(SessionActive){ + SessionActive=false; + try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation); } } private func alive(){ @@ -434,93 +454,63 @@ return [ } isRec=false; - main.Log.i(RecordApis.LogTag, "结束录音,已录制:"+String(sendCount)+"段 "+String(duration)+"ms start到stop:"+String(Code.GetMS()-startTime)+"ms"); + main.Log.i(RecordApis.LogTag, "结束录音,(cb:"+String(recCbCount)+") 已录制:"+String(sendCount)+"段 "+String(duration)+"ms start到stop:"+String(Code.GetMS()-startTime)+"ms"); callback(nil); - if(logData) { - let dir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! - let fullFile=dir+"/record-full.pcm"; - - if !logStreamFull.write(toFile: fullFile, atomically: false) { - main.Log.e(RecordApis.LogTag, "保存文件失败"+fullFile); - } - } destroy(); } private var readTotal=0; private var duration=0; + private var recCbCount=0; private var sendCount=0; - private func readAsync(){ - let sampleRateSrc=sampleRate; - var bufferLen=(sampleRateSrc/12)*2;//每秒返回12次,按Int16需要乘2 - bufferLen+=bufferLen%2;//保证16位 + private var sendBuffer=NSMutableData(); + private var firstLog=false; + private let onRecFrame: AURenderCallback = { (inRefCon, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData ) -> OSStatus in + if(Current==nil || !Current.isRec){ return 0; } + let size = inNumberFrames * 2; + let buffer = AudioBuffer(mNumberChannels:1, mDataByteSize: size, mData: malloc(Int(size))); + var bufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: buffer); - let itemMs=1000/12; - var prevTime=Int64(0); + let status = AudioUnitRender(Current.AUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, &bufferList); + if(!(status==0)){ + free(buffer.mData); + Current.main.Log.e("录音实时处理", "AudioUnitRender错误["+String(status)+"]"); + return 0; + } - let cache=NSMutableData(); + let data=Data.init(bytes: buffer.mData!, count: Int(buffer.mDataByteSize)); + free(buffer.mData); + Current.onRecFrame__Exec(data); + return 0; + } + private func onRecFrame__Exec(_ data:Data){ + recCbCount+=1; + //先写入缓冲,未配置setPreferredIOBufferDuration回调太快 + sendBuffer.append(data); + let frameSize=max(data.count, sampleRate*2/12); //录音帧时长 1000/12 + if(sendBuffer.count=bufferLen { - let d1=cache.subdata(with: NSMakeRange(0, bufferLen)); - let d2=cache.subdata(with: NSMakeRange(bufferLen, cache.count-bufferLen)); - cache.setData(d2); - - if(logData) { - logStreamFull.append(d1); - } - readTotal+=d1.count; - duration=readTotal/(sampleRateSrc/1000)/2; - sendCount+=1; - main.runScript_JsBridge( - "var b64=\"" + d1.base64EncodedString() + "\";" + - "var sampleRate=\(sampleRateSrc);" + - "var postMsg={type:'" + RecordAppJsBridge.JsRequestName + "',action:'Record',data:{pcmDataBase64:b64,sampleRate:sampleRate}};" - , RecordAppJsBridge.JsRequestName + ".Record(b64,sampleRate)" - , "postMsg" ); - - if(!firstLog){ - main.Log.i(RecordApis.LogTag, "获取到了第一段录音数据:len:\(d1.count) bufferLen:\(bufferLen) sampleRate:\(sampleRateSrc)"); - firstLog=true; - } - - - //进行匀速回调,因为AVAudioRecorder写入的数据有蛮大延迟,所以最终结果也会有蛮大延迟,用AudioQueue、AudioUnit低级OC api会好很多,但太低级了,复杂难用。 - let delay=Int64(itemMs-10) - (Code.GetMS()-prevTime) - if delay>0 { - ThreadX.Sleep(Int(delay)); - } - prevTime=Code.GetMS(); - } - }else{ - //跳过caf文件头 - if cache.count>=skipLen { - skiped=true; - let d2=cache.subdata(with: NSMakeRange(skipLen, cache.count-skipLen)); - cache.setData(d2); - } - } + readTotal+=d1.count; + duration=readTotal/(sampleRate/1000)/2; + sendCount+=1; + main.runScript_JsBridge( + "var b64=\"" + d1.base64EncodedString() + "\";" + + "var sampleRate=\(sampleRate);" + + "var postMsg={type:'" + RecordAppJsBridge.JsRequestName + "',action:'Record',data:{pcmDataBase64:b64,sampleRate:sampleRate}};" + , RecordAppJsBridge.JsRequestName + ".Record(b64,sampleRate)" + , "postMsg" ); + + if(!firstLog){ + main.Log.i(RecordApis.LogTag, "获取到了第一段录音数据:len:\(d1.count) sampleRate:\(sampleRate)"); + firstLog=true; } - input?.closeFile(); } } diff --git a/app-support-sample/index.html b/app-support-sample/index.html index f63f0193..8262e3c1 100644 --- a/app-support-sample/index.html +++ b/app-support-sample/index.html @@ -70,6 +70,7 @@ + @@ -348,9 +349,11 @@
- - ms - + +
+
+ +
@@ -360,7 +363,7 @@
- +
@@ -379,6 +382,37 @@ 如需录音功能定制开发,网站、App、小程序、前端后端开发等需求,请加QQ群:①群 781036591、②群 748359095、③群 450721519,口令recorder,联系群主(即作者),谢谢~
+ +
+ 音乐播放测试 : + + + + + + + + Audio对录音的影响测试 (issues#34) ;低版本iOS Safari如果未开始过录音并且播放了音乐,然后后续录音可能会有问题;再现方法 (test apple developer forums): 刷新页面后首先先播放音乐,然后开始测试录音,会发现波形显示掉帧或者保持直线。另测试浏览器对音频的支持情况。 +
+ +
+ 视频播放测试 : + + + + Video对录音的影响测试 (issues#84) ;iOS Safari可能出现先播放视频,然后再开始录音,会自动播放视频的声音,但并未再现。 + + + + + +
+
浏览器环境情况 : @@ -443,16 +477,28 @@ cancelAutoStop(); }; -function recreq(){ +var reqUseAEC; +function recreq(call){ + call||(call=function(msg){ + msg&&reclog(msg,1); + }); baseSet(); reclog(Html_$T("LnQj::开始请求授权...")); + reqUseAEC=$(".useAECSet")[0].checked; + if(reqUseAEC){ + //这个是Start中的audioTrackSet配置,在h5中必须提前配置,因为h5中RequestPermission会直接打开录音 + RecordApp.RequestPermission_H5OpenSet={ audioTrackSet:{ echoCancellation:true,noiseSuppression:true,autoGainControl:true } }; + reclog(Html_$T("W5dU::已启用audioTrackSet配置:")+JSON.stringify(RecordApp.RequestPermission_H5OpenSet.audioTrackSet)); + }; + RecordApp.RequestPermission(function(){ reclog(RecordApp.Current.Key+" "+Html_$T("wnd4::已授权"),2); + call(); },function(err,isUserNotAllow){ - reclog((RecordApp.Current&&RecordApp.Current.Key||"[?]") + call((RecordApp.Current&&RecordApp.Current.Key||"[?]") +(isUserNotAllow?" UserNotAllow, ":"") - +" "+Html_$T("oFqf::授权失败:")+err,1); + +" "+Html_$T("oFqf::授权失败:")+err); }); }; @@ -506,7 +552,6 @@ window.takeoffChunks=[]; var realTimeSendSet=$(".realTimeSendSet")[0].checked; - var realTimeSendTime=+$(".realTimeSend").val(); if(realTimeSendSet&&!RecordApp.Current.CanProcess()){ reclog(Html_$T("GM5h::当前环境{1}不支持实时回调,不能模拟实时编码传输",0,RecordApp.Current.Key),1); }; @@ -523,7 +568,7 @@ type:type ,bitRate:bit ,sampleRate:sample - //,audioTrackSet:{echoCancellation:true,noiseSuppression:true,autoGainControl:true} //配置回声消除,注意:H5中需要在请求录音权限前进行相同配置RecordApp.RequestPermission_H5OpenSet后此配置才会生效 + ,audioTrackSet:!reqUseAEC?null:{echoCancellation:true,noiseSuppression:true,autoGainControl:true} //配置回声消除,注意:H5中需要在请求录音权限前进行相同配置RecordApp.RequestPermission_H5OpenSet后此配置才会生效 ,onProcess:function(buffers,powerLevel,duration,sampleRate,newBufferIdx){ $(".recpowerx").css("width",powerLevel+"%"); $(".recpowert").text(formatMs(duration,1)+" / "+powerLevel); @@ -539,7 +584,10 @@ //实时传输 if(realTimeSendSet&&window.realTimeSendTry){ - realTimeSendTry(set,realTimeSendTime,buffers,sampleRate); + realTimeSendTry(set,buffers,sampleRate); + }; + if(realTimeSendSet&&window.RtVoiceProcess){ + RtVoiceProcess(buffers,powerLevel,duration,sampleRate,newBufferIdx); }; //实时语音识别 if(asrSet&&window.asrInput){ @@ -741,13 +789,14 @@ run(); }; function recplay(key){ + var audio=$(".recPlay")[0]; + audio.style.display="inline-block"; + if(!(audio.ended || audio.paused)){ + audio.pause(); + }; + var o=recblob[key]; if(o){ - var audio=$(".recPlay")[0]; - audio.controls=true; - if(!(audio.ended || audio.paused)){ - audio.pause(); - }; o.play=(o.play||0)+1; var logmsg=function(msg){ $(".p"+key).html(''+o.play+' '+new Date().toLocaleTimeString()+" "+msg); @@ -757,6 +806,19 @@ logmsg(''+Html_$T("kj0b::播放失败")+'['+audio.error.code+']'+audio.error.message+''); }; + if(o.play2Name){ + o.play--; + if(o.play2Msg){ + logmsg(o.play2Msg); + }else if(o.play2Err){ + logmsg(''+o.play2Err+''); + }else{ + o.play++; + audio.src=o.play2Url||("../assets/audio/"+o.play2Name); + audio.play(); + } + return; + }; var end=function(blob){ audio.src=(window.URL||webkitURL).createObjectURL(blob); audio.play(); @@ -783,6 +845,49 @@ }; }; }; +function recplay2(elem,name){ + var url=""; + var run=function(msg,err){ + elem=$(elem); + var key="recplay2"+elem.html(); + Object.assign(recblob[key]||(recblob[key]={}),{ + play2Name:name + ,play2Url:url + ,play2Msg:msg + ,play2Err:err + }); + if(!$(".p"+key).length){ + elem.before('
'); + elem.after('
'); + }; + + recplay(key); + }; + + if(name=="nmn5"){ //合成一个5分钟的mp3 + if(window.nmn5Url){ + url=window.nmn5Url; return run(); + } + var sr=16000; + var pcm=Recorder.NMN2PCM.GetExamples().Canon.get(sr).pcm; + var pcm5=new Int16Array(5*60*sr),n=0; + while(n{ this.reclog("已获得录音权限,可以开始录音了",2); + if(this.reqOkCall)this.reqOkCall(); this.reqOkCall=null; //留别的组件内调用的回调 },(msg,isUserNotAllow)=>{ if(isUserNotAllow){//用户拒绝了录音权限 //这里你应当编写代码检查wx.getSetting中的scope.record录音权限,引导用户进行授权 @@ -64,6 +65,9 @@ Page({ type:this.data.recType ,sampleRate:this.data.recSampleRate ,bitRate:this.data.recBitRate + ,audioTrackSet:!this.data.useAEC?null:{ //配置回声消除,小程序的只在Android生效,iOS不支持 + noiseSuppression:true,echoCancellation:true,autoGainControl:true + } ,onProcess:(buffers,powerLevel,duration,sampleRate,newBufferIdx,asyncEnd)=>{ //可视化图形绘制 this.setData({ @@ -74,6 +78,8 @@ Page({ if(wave){ wave.input(buffers[buffers.length-1],powerLevel,sampleRate); } + //实时语音通话对讲,实时处理录音数据 + if(this.wsVoiceProcess) this.wsVoiceProcess(buffers,powerLevel,duration,sampleRate,newBufferIdx); } ,takeoffEncodeChunk:!this.data.takeoffEncodeChunkSet?null:(chunkBytes)=>{ //实时接收到编码器编码出来的音频片段数据,chunkBytes是Uint8Array二进制数据,可以实时上传(发送)出去 @@ -82,8 +88,22 @@ Page({ this.takeEcChunks.push(chunkBytes); } },()=>{ + var iosSpeakerOff=false; + if(this.data.useAEC){ + this.reclog("小程序的回声消除只在Android中生效,iOS不支持,iOS上将使用听筒播放,大幅减弱回声","#fa0"); + if(wx.getSystemInfoSync().platform=="ios"){ + iosSpeakerOff=true; + wx.setInnerAudioOption({ speakerOn:false }); + } + } + if(!iosSpeakerOff && this.iosSpeakerOff){ + wx.setInnerAudioOption({ speakerOn:true }); + } + this.iosSpeakerOff=iosSpeakerOff; + this.reclog("录音中 type="+this.data.recType +" "+this.data.recSampleRate+" "+this.data.recBitRate+"kbps" + +(this.data.useAEC?" useAEC":"") +(this.data.takeoffEncodeChunkSet?" takeoffEncodeChunk":""),2); //创建音频可视化图形绘制 this.initWaveStore(); @@ -103,7 +123,15 @@ Page({ this.reclog("继续录音中..."); } } + ,__stopClear(){ + //恢复AEC设置的外放 + if(this.iosSpeakerOff){ + this.iosSpeakerOff=false; + wx.setInnerAudioOption({ speakerOn:true }); + } + } ,recStopX(){ + this.__stopClear(); RecordApp.Stop( null //success传null就只会清理资源,不会进行转码 ,(msg)=>{ @@ -113,6 +141,7 @@ Page({ } ,recStop(){ this.reclog("正在结束录音..."); + this.__stopClear(); RecordApp.Stop((aBuf,duration,mime)=>{ var recSet=RecordApp.GetCurrentRecOrNull().set; this.reclog("已录制["+mime+"]:"+duration+"ms "+aBuf.byteLength+"字节 " @@ -130,6 +159,9 @@ Page({ aBuf=chunkData.buffer; this.reclog("takeoffEncodeChunk接收到的音频片段,已合并成一个音频文件 "+aBuf.byteLength+"字节"); } + //用变量保存起来,别的地方调用 + this.lastRecType=recSet.type; + this.lastRecBuffer=aBuf; this.selectComponent('.player').setPlayFile(aBuf,duration,mime,recSet); },(msg)=>{ @@ -147,9 +179,11 @@ Page({ ,takeoffEncodeChunkSet:false ,takeoffEncodeChunkMsg:"" + ,useAEC:false + ,showUpload:false ,recwaveChoiceKey:"WaveView" - ,reclogs:[] + ,reclogs:[],reclogLast:"" } ,onLoad(options) { this.reclog("页面onLoad Recorder.LM="+Recorder.LM+" RecordApp.LM="+RecordApp.LM); @@ -163,7 +197,7 @@ Page({ var txt="["+t+"]"+msg; console.log(txt); this.data.reclogs.splice(0,0,{txt:txt,color:color}); - this.setData({reclogs:this.data.reclogs}); + this.setData({reclogs:this.data.reclogs, reclogLast:{txt:txt,color:color}}); } ,inputSet(e){ var val=e.detail.value; @@ -175,6 +209,12 @@ Page({ ,takeoffEncodeChunkSetClick(){ this.setData({ takeoffEncodeChunkSet:!this.data.takeoffEncodeChunkSet }); } + ,useAEC_Click(){ + this.setData({ useAEC:!this.data.useAEC }); + } + ,showUploadClick(){ + this.setData({ showUpload:!this.data.showUpload }); + } ,recTypeClick(res){ var type=res.target.dataset.type; if(type){ diff --git a/app-support-sample/miniProgram-wx/pages/recTest/recTest.json b/app-support-sample/miniProgram-wx/pages/recTest/recTest.json index e108c19f..ad06a3c4 100644 --- a/app-support-sample/miniProgram-wx/pages/recTest/recTest.json +++ b/app-support-sample/miniProgram-wx/pages/recTest/recTest.json @@ -2,5 +2,7 @@ "navigationBarTitleText":"RecordApp录音测试" ,"usingComponents": { "test-player":"../test_player__/test_player__" + ,"test-upload-view":"../test_upload_saveFile__/test_upload_saveFile__" + ,"test-rtvoice-view":"../test_realtime_voice__/test_realtime_voice__" } } \ No newline at end of file diff --git a/app-support-sample/miniProgram-wx/pages/recTest/recTest.wxml b/app-support-sample/miniProgram-wx/pages/recTest/recTest.wxml index 48f8e00b..7edfb07b 100644 --- a/app-support-sample/miniProgram-wx/pages/recTest/recTest.wxml +++ b/app-support-sample/miniProgram-wx/pages/recTest/recTest.wxml @@ -79,10 +79,20 @@ 接管编码器输出(takeoffEncodeChunk) {{takeoffEncodeChunkMsg}} + + 尝试启用回声消除(echoCancellation) + + 录音上传、实时语音通话聊天对讲 + + + @@ -91,6 +101,11 @@ {{item.txt}} + + + {{reclogLast.txt}} + + diff --git a/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.js b/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.js new file mode 100644 index 00000000..8c226834 --- /dev/null +++ b/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.js @@ -0,0 +1,455 @@ +// 实时语音通话聊天对讲,websocket实时传输数据 + +var Recorder=require("../../copy-rec-src/src/recorder-core.js"); + +Component({ + data: { + wsApi:"", wsID1:"", wsID2:"" + , ws_readAudioSet:false, ws_audioFrameCount:0, ws_audioFrameSize:0, ws_audioFrameDur:0, ws_audioFrameDurTxt:"" + + ,ws_voiceSendUserCount:0,ws_voiceSendOKCount:0,ws_voiceSendErrCount:0,ws_voiceSendSize:0,ws_voiceSendDur:0,ws_voiceSendDurTxt:"" + ,ws_voiceReceiveCount:0,ws_voiceReceiveSize:0,ws_voiceReceiveDur:0,ws_voiceReceiveDurTxt:"" + }, + attached(){ + var data={}; + data.wsID1=wx.getStorageSync("page_test_upsf_wsID1")||"1"; + data.wsID2=wx.getStorageSync("page_test_upsf_wsID2")||"2"; + + var wsApi="ws://你电脑局域网ip:9529/ws123"; + data.wsApi=wx.getStorageSync("page_test_upsf_wsApi")||wsApi; + + this.setData(data); + + var ps=getCurrentPages(); + this.parentPage=ps[ps.length-1]; + console.log({test_upload_saveFile__:this}); + }, + detached(){ + clearInterval(this.spWxTimer); + this.getPage().wsVoiceProcess=null; + if(this.socket) this.socket.close(); + }, + methods: { + inputSet(e){ + var val=e.detail.value; + var data=e.target.dataset; + if(val && data.type=="number"){ val=+val||0; } + var obj={}; obj[data.key]=val; + this.setData(obj); + } + ,getPage(){ + return this.parentPage; + } + ,log(){ + var p=this.getPage(); + p.reclog.apply(p,arguments); + } + ,formatTime(ms,showSS){ + var ss=ms%1000;ms=(ms-ss)/1000; + var s=ms%60;ms=(ms-s)/60; + var m=ms%60;ms=(ms-m)/60; + var h=ms, v=""; + if(h>0) v+=(h<10?"0":"")+h+":"; + v+=(m<10?"0":"")+m+":"; + v+=(s<10?"0":"")+s; + if(showSS)v+="″"+("00"+ss).substr(-3);; + return v; + } + ,checkSet(api){ + if(api==2){ + if(!/^wss?:\/\/.+/i.test(this.data.wsApi) || /局域网/.test(this.data.wsApi)){ + this.log("请配置ws地址,比如填写:ws://127.0.0.1:9529/",1); + return false; + } + wx.setStorageSync("page_test_upsf_wsApi", this.data.wsApi); //测试用的存起来 + + if(!this.data.wsID1){ + this.log("请填写我的标识"); + return false; + } + wx.setStorageSync("page_test_upsf_wsID1", this.data.wsID1); //测试用的存起来 + } + return true; + } + + + ,ws_readAudioSetClick(){ + this.setData({ws_readAudioSet:!this.data.ws_readAudioSet}); + } + + + + + + //连接websocket + ,wsConnClick(){ + if(!this.checkSet(2))return; + this.log("正在连接"+this.data.wsApi+"..."); + if(this.socket) this.socket.close(); + var sid=this.SID=(this.SID||0)+1; //同步操作 + + this.socketIsOpen=false; + this.socket=wx.connectSocket({ + url:this.data.wsApi + ,success:()=>{} + ,fail:(e)=>{ this.log("ws连接fail:"+e.errMsg,1) } + }); + this.socket.onClose(()=>{ + if(sid!=this.SID) return; + this.socketIsOpen=false; + this.log("ws已断开"); + }); + this.socket.onError((e)=>{ + if(sid!=this.SID) return; + this.socketIsOpen=false; + this.log("ws因为错误已断开:"+e.errMsg,1); + if(/No route/i.test(e.errMsg)){ + this.log("ws因为错误无法连接。如果是iOS,可能由于iOS上不允许App访问本地网络,请到“系统设置 > 隐私 > 本地网络”中打开权限,方便本地测试",1); + } + }); + this.socket.onOpen(()=>{ + if(sid!=this.SID) return; + this.socketIsOpen=true; + this.socket.number=1; + this.socket.sendCalls={}; + this.log("ws已连接",2); + + this.ws__sendMessage("setMeta",{uid:this.data.wsID1},null,null,()=>{ + this.log("ws已绑定标识:"+this.data.wsID1,2); + },(err)=>{ + this.log("ws绑定标识出错:"+err,1); + }); + + this.setData({ + ws_voiceReceiveCount:0 + ,ws_voiceReceiveSize:0 + ,ws_voiceReceiveDur:0 + ,ws_voiceReceiveDurTxt:"00:00" + }); + this.resetWsSendVoice(); + this.initStreamPlay(); //先初始化播放器 + }); + this.socket.onMessage((e)=>{ + if(sid!=this.SID) return; + this.ws__receiveMessage(e.data); + }); + } + ,wsDisconnClick(){ + if(this.socketIsOpen)this.log("ws正在断开..."); + else this.log("ws未连接"); + if(this.socket) this.socket.close(); + } + //解析处理服务器消息 + ,ws__receiveMessage(rawMsg){ + var binary=new Uint8Array(0),rawTxt=rawMsg;//纯文本消息 + if (rawMsg instanceof ArrayBuffer) {//二进制内容,提取第一行文本 + var bytes=new Uint8Array(rawMsg); + var str="",bIdx=bytes.length; + for(var i=0;i{ + delete socket.sendCalls[msgNo]; + onFail("等待服务器响应超时"); + },60000); + socket.sendCalls[msgNo]={success:onSuccess,fail:onFail,timer:timer}; + } + + var rawTxt=JSON.stringify(msgObj); + if(bytes && bytes.length){//换行拼接二进制内容 + var str=unescape(encodeURIComponent(rawTxt)); + var u8arr=new Uint8Array(str.length); + for(var i=0;i{ + socket.audioStartToken=data.token; + this.log("已打开服务器端语音流 readAudio="+(!!this.data.ws_readAudioSet)+" token="+data.token,2); + },(err)=>{ + this.log("打开服务器端语音流出错:"+err,1); + }); + } + //结束模拟播放语音流 + ,wsAudioStopClick(){ + var socket=this.socket; + var token=socket && socket.audioStartToken; + if(token){ + this.ws__sendMessage("audioStop",{token:token},null,null,()=>{ + socket.audioStartToken=""; + this.log("已停止服务器端语音流"); + },(err)=>{ + this.log("停止服务器端语音流出错:"+err,1); + }); + } + } + //收到服务器模拟语音流片段数据,进行播放 + ,onMsg__audioFrame(data,binary,msgObj){ + var pcm=new Int16Array(binary.buffer); + var set={}; + set.ws_audioFrameCount=this.data.ws_audioFrameCount=this.data.ws_audioFrameCount+1; + set.ws_audioFrameSize=this.data.ws_audioFrameSize=this.data.ws_audioFrameSize+binary.length; + set.ws_audioFrameDur=Math.round(set.ws_audioFrameSize/2/data.sampleRate*1000); + set.ws_audioFrameDurTxt=this.formatTime(set.ws_audioFrameDur); + this.setData(set); + + this.streamPlay(pcm,data.sampleRate); + } + + + //语音通话对讲 + ,wsOpenVoiceClick(){ + if(!this.socketIsOpen) return this.log("ws未连接",1); + if(!this.data.wsID2) return this.log("请填写对方标识",1); + if(this.data.wsID1==this.data.wsID2) return this.log("对方标识不能和我的标识相同",1); + wx.setStorageSync("page_test_upsf_wsID2", this.data.wsID2); //测试用的存起来 + this.log("我方已开始语音发送,请在上面进行录音操作",2); + + //调用 main_recTest.vue 页面中的录音功能 + var page=this.getPage(); + page.reqOkCall=()=>{ //重新开始录音 + page.data.useAEC=true; //启用回声消除 + page.setData({ useAEC:true }); + page.recStart(); + }; + page.recReq(); + + var lastIdx=1e9,chunk=null; + //在录音onProcess里面直接实时处理,这里的参数就是onProcess的参数 + page.wsVoiceProcess=(buffers,powerLevel,duration,sampleRate,newBufferIdx)=>{ + //实时转码,上传,这里只提取最新的pcm发送出去即可 + if(lastIdx>newBufferIdx){ + chunk=null; //重新录音了,重置环境 + } + lastIdx=newBufferIdx; + + //借用SampleData函数进行数据的连续处理,采样率转换是顺带的,得到新的pcm数据 + chunk=Recorder.SampleData(buffers,sampleRate,16000,chunk); + var pcm=chunk.data; + + //二进制pcm + var bytes=new Uint8Array(pcm.buffer); + + //发送pcm出去 + this.ws__sendMessage("sendTo",{ + toMetaKey:"uid",toMetaValue:this.data.wsID2 //接收方信息,可以是群组(群组的需控制同时只能一人发,否则多人得服务器端混流) + ,sendType:"custom_voiceFrame",sendData:{ + fromMetaKey:"uid",fromMetaValue:this.data.wsID1//告诉对方是我发的信息 + ,sampleRate:16000 //采样率 + } + },bytes,null,(data)=>{ + var set={}; + set.ws_voiceSendUserCount=data.count; + if(data.count){ + set.ws_voiceSendOKCount=this.data.ws_voiceSendOKCount=this.data.ws_voiceSendOKCount+1; + }else{ //没有接收方 + set.ws_voiceSendErrCount=this.data.ws_voiceSendErrCount=this.data.ws_voiceSendErrCount+1; + } + set.ws_voiceSendSize=this.data.ws_voiceSendSize=this.data.ws_voiceSendSize+pcm.byteLength; + set.ws_voiceSendDur=Math.round(set.ws_voiceSendSize/2/16000*1000); + set.ws_voiceSendDurTxt=this.formatTime(set.ws_voiceSendDur); + this.setData(set); + }); + }; + this.resetWsSendVoice(); + } + ,resetWsSendVoice(){ + this.setData({ + ws_voiceSendUserCount:0 + ,ws_voiceSendOKCount:0 + ,ws_voiceSendErrCount:0 + ,ws_voiceSendSize:0 + ,ws_voiceSendDur:0 + ,ws_voiceSendDurTxt:"00:00" + }); + } + //结束语音通话对讲 + ,wsCloseVoiceClick(){ + this.getPage().wsVoiceProcess=null; + this.log("我方已结束语音发送"); + } + //收到对方发来的自定义类型的语音数据 + ,onMsg__custom_voiceFrame(data,binary,msgObj){ + var pcm=new Int16Array(binary.buffer); + var set={}; + set.ws_voiceReceiveCount=this.data.ws_voiceReceiveCount=this.data.ws_voiceReceiveCount+1; + set.ws_voiceReceiveSize=this.data.ws_voiceReceiveSize=this.data.ws_voiceReceiveSize+binary.length; + set.ws_voiceReceiveDur=Math.round(set.ws_voiceReceiveSize/2/data.sampleRate*1000); + set.ws_voiceReceiveDurTxt=this.formatTime(set.ws_voiceReceiveDur); + this.setData(set); + + this.streamPlay(pcm,data.sampleRate); + } + + + //播放实时的语音流 + ,streamPlay(pcm,sampleRate){ + this.initStreamPlay(); + if(sampleRate!=16000){ console.warn("未适配非16000采样率的pcm播放"); return; } + + this.addWxPlayBuffer && this.addWxPlayBuffer(pcm); + } + //初始化播放器 + ,initStreamPlay(){ + if(this.spWxCtx && this.spWxCtx.state=="running") return; + if(this.spWxCtx){ + if(Date.now()-this.spWxCtx.__time<2000) return;//wait running + this.spWxCtx.close(); + }; + var playBuffers=[], playBufferLen=0; + this.addWxPlayBuffer=(pcm)=>{ + playBuffers.push(pcm); + playBufferLen+=pcm.length; + }; + try{ + this.spWxCtx=wx.createWebAudioContext(); + if(!this.spWxCtx)throw new Error(""); + }catch(e){ + this.log("微信版本太低,无法创建WebAudioContext",1); + return; + } + this.spWxCtx.__time=Date.now(); + this.log("微信streamPlay已打开(播放效果一般,听个响)",2); + + if(this.spWxTimer)clearInterval(this.spWxTimer); + this.spWxTimer=setInterval(()=>{ + this.spWxPlay(); + },300); + this.spWxPlay=()=>{ + // 参考Recorder源码 /assets/runtime-codes/fragment.playbuffer.js + var ctx=this.spWxCtx; + var sampleRate=16000,dur=300; + var audioSize=sampleRate/1000*dur; + + var arr=playBuffers,arrSize=playBufferLen; playBuffers=[]; playBufferLen=0; + var more=new Int16Array(Math.max(0, arrSize-audioSize)),moreOffset=0; + + var audio=ctx.createBuffer(1, audioSize, sampleRate); + var channel=audio.getChannelData(0); + var sd=sampleRate/1000*1;//1ms的淡入淡出 大幅减弱爆音 + var sd2=audioSize-sd; + for(var j=0,idx=0;jsd2){ + factor=(audioSize-idx)/sd; + }; + if(idx0){ + if(more.length>arrSize/2){ + more=more.subarray(~~(more.length-arrSize/2)); + } + this.addWxPlayBuffer(more); + } + + //播放 + var source=ctx.createBufferSource(); + source.buffer=audio; + source.connect(ctx.destination) + source.start(); + + if(this.lastSource2)this.lastSource2.disconnect(); + this.lastSource2=this.lastSource1; + this.lastSource1=source; + }; + } + + + } +}); \ No newline at end of file diff --git a/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.json b/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.json new file mode 100644 index 00000000..2e31abd5 --- /dev/null +++ b/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.wxml b/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.wxml new file mode 100644 index 00000000..19833ce4 --- /dev/null +++ b/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.wxml @@ -0,0 +1,45 @@ + + + + + 实时语音通话对讲 + 源码:test_realtime_voice__ + + + ws(s): + + + 需要先在电脑上运行Recorder仓库/assets/node-localServer内的nodejs服务器端脚本,然后填写你电脑局域网ip即可测试(开发工具里面用127.0.0.1可用ws),支持ws、wss测试WebSocket地址 + + + 我的标识 + + + + + + + 服务器将pcm片段实时发送给客户端,模拟播放语音流 + 读audio-16k.wav + + + + {{ws_audioFrameDurTxt}},{{ws_audioFrameCount}}帧,{{ws_audioFrameSize}}字节 + + + + + + 语音通话聊天对讲,请在上面进行录音操作,音频数据会实时传送给对方播放(实时pcm) + 对方标识 + + + + + 接收:{{ws_voiceReceiveDurTxt}},{{ws_voiceReceiveCount}}帧,{{ws_voiceReceiveSize}}字节 + 发送:{{ws_voiceSendDurTxt}},{{ws_voiceSendUserCount}}人接收,OK {{ws_voiceSendOKCount}}帧,Err {{ws_voiceSendErrCount}}帧,{{ws_voiceSendSize}}字节 + + + + + \ No newline at end of file diff --git a/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.wxss b/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.wxss new file mode 100644 index 00000000..d3f5a12f --- /dev/null +++ b/app-support-sample/miniProgram-wx/pages/test_realtime_voice__/test_realtime_voice__.wxss @@ -0,0 +1 @@ + diff --git a/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.js b/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.js new file mode 100644 index 00000000..b06224fd --- /dev/null +++ b/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.js @@ -0,0 +1,153 @@ +// 上传保存录音文件 +Component({ + data: { + httpApi:"" + }, + attached(){ + var httpApi="http://你电脑局域网ip:9528/"; + httpApi=wx.getStorageSync("page_test_upsf_httpApi")||httpApi; + this.setData({ httpApi:httpApi }); + + var ps=getCurrentPages(); + this.parentPage=ps[ps.length-1]; + console.log({test_upload_saveFile__:this}); + }, + methods: { + inputSet(e){ + var val=e.detail.value; + var data=e.target.dataset; + if(val && data.type=="number"){ val=+val||0; } + var obj={}; obj[data.key]=val; + this.setData(obj); + } + ,getPage(){ + return this.parentPage; + } + ,log(){ + var p=this.getPage(); + p.reclog.apply(p,arguments); + } + ,checkSet(api){ + if(!api || api==1){ + this.audioABuffer=this.getPage().lastRecBuffer; + this.audioType=this.getPage().lastRecType; + if(!this.audioABuffer){ + this.log("请先录个音",1); + return false; + } + } + if(api==1){ + if(!/^https?:\/\/.+\/$/i.test(this.data.httpApi) || /局域网/.test(this.data.httpApi)){ + this.log("请配置http地址(/结尾),比如填写:http://127.0.0.1:9528/",1); + return false; + } + wx.setStorageSync("page_test_upsf_httpApi", this.data.httpApi); //测试用的存起来 + } + return true; + } + + + //================【上传】=================== + //录音转成base64文本,使用普通表单进行上传(application/x-www-form-urlencoded) + ,uploadBase64Click(){ + if(!this.checkSet(1))return; + this.log("正在base64上传..."); + wx.request({ + url: this.data.httpApi+"uploadBase64" + ,method: "POST" + ,header: { "content-type":"application/x-www-form-urlencoded" } + ,data: { + upfile_b64: wx.arrayBufferToBase64(this.audioABuffer) + ,mime:"audio/"+this.audioType + } + ,fail: (e)=>{ this.log("base64上传出错:"+e.errMsg,1); } + ,success: (e) => { + if(e.data.c!==0){ + this.log("base64上传错误:"+(e.data.m||"未识别上传接口返回结果"),1); + return; + } + this.log("base64上传成功:"+JSON.stringify(e.data.v),2); + } + }); + } + //录音文件使用上传表单进行上传(multipart/form-data) + ,uploadClick(){ + if(!this.checkSet(1))return; + this.log("正在上传... url:"+this.data.httpApi+"upload"); + + SaveLocalFile(this.audioABuffer, this.audioType, (savePath)=>{ + var delFile=()=>{ DeleteLocalFile(savePath) }; //上传结束就删除掉临时文件 + wx.uploadFile({ + url: this.data.httpApi+"upload" + ,filePath: savePath + ,name: "upfile" + ,formData: { } + ,fail: (e)=>{ + delFile(); + this.log("上传出错:"+e.errMsg,1); + if(/-109/.test(e.errMsg) && /ERR_ADDRESS_UNREACHABLE/.test(e.errMsg)){ + this.log("无法上传。如果是iOS,可能由于iOS上不允许App访问本地网络,请到“系统设置 > 隐私 > 本地网络”中打开权限,方便本地测试",1); + } + } + ,success: (e) => { + delFile(); + var data={}; try{ data=JSON.parse(e.data) }catch(e){ } + if(data.c!==0){ + this.log(data.m||"未识别上传接口返回结果",1); + return; + } + this.log("上传成功:"+JSON.stringify(data),2); + } + }); + }, (err)=>{ + this.log("无法上传:"+err,1); + }); + } + } +}); + + + +//================保存文件到本地=================== +/**小程序支持保存文件到本地,方便后续播放、上传 +arrayBuffer和type:RecordApp.Stop得到的录音文件数据和录音类型;type也可以用对象直接提供一个固定的文件名 +success:fn(savePath) 保存成功后返回保存的路径;小程序为 wx.env.USER_DATA_PATH 路径 +fail: fn(errMsg) 保存失败回调 +*/ +var SaveLocalFile=function(arrayBuffer,type,success,fail){ + //生成一个文件名 + var fileName=type.fileName||__LocalFileName(type); + + var path=wx.env.USER_DATA_PATH+"/"+fileName; + var mg=wx.getFileSystemManager(); + mg.writeFile({ + filePath:path, data:arrayBuffer, encoding:"binary" + ,success:()=>{ success(path); } + ,fail:(e)=>{ fail("保存文件"+fileName+"失败:"+e.errMsg); } + }); +}; +/**生成一个文件名*/ +var __LocalFileName=function(type){ + var now=new Date(); + var fileName="local-"+now.getFullYear() + +("0"+(now.getMonth()+1)).substr(-2) + +("0"+now.getDate()).substr(-2) + +("0"+now.getHours()).substr(-2) + +("0"+now.getMinutes()).substr(-2) + +("0"+now.getSeconds()).substr(-2) + +("00"+now.getMilliseconds()).substr(-3) + +(Math.random()+"").substr(2,6) + +"."+(type||"bin"); + return fileName; +}; +/**删除SaveLocalFile保存到本地的文件。 +savePath:SaveLocalFile得到的保存路径 +*/ +var DeleteLocalFile=function(savePath){ + wx.getFileSystemManager().unlink({ + filePath:savePath + ,success:()=>{ console.log("DeleteLocalFile 已删除文件 path="+savePath); } + ,fail:(e)=>{ console.error("DeleteLocalFile 删除文件失败:"+e.errMsg+" path="+savePath); } + }); +}; + diff --git a/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.json b/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.json new file mode 100644 index 00000000..2e31abd5 --- /dev/null +++ b/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.wxml b/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.wxml new file mode 100644 index 00000000..64513d24 --- /dev/null +++ b/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.wxml @@ -0,0 +1,18 @@ + + + + + 上传到服务器 + 源码:test_upload_saveFile__ + + + http(s): + + + 需要先在电脑上运行Recorder仓库/assets/node-localServer内的nodejs服务器端脚本,然后填写你电脑局域网ip即可测试(开发工具里面用127.0.0.1),支持http、https测试 + + + + + + \ No newline at end of file diff --git a/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.wxss b/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.wxss new file mode 100644 index 00000000..d3f5a12f --- /dev/null +++ b/app-support-sample/miniProgram-wx/pages/test_upload_saveFile__/test_upload_saveFile__.wxss @@ -0,0 +1 @@ + diff --git a/app-support-sample/miniProgram-wx/project.config.json b/app-support-sample/miniProgram-wx/project.config.json index 95796bd0..8ab09e98 100644 --- a/app-support-sample/miniProgram-wx/project.config.json +++ b/app-support-sample/miniProgram-wx/project.config.json @@ -1,30 +1,30 @@ -{ - "appid": "youAppID", - "compileType": "miniprogram", - "libVersion": "2.32.3", - "packOptions": { - "ignore": [], - "include": [] - }, - "setting": { - "urlCheck": false, - "coverView": true, - "es6": true, - "postcss": true, - "minified": true, - "enhance": true, - "showShadowRootInWxmlPanel": true, - "packNpmRelationList": [], - "babelSetting": { - "ignore": [], - "disablePlugins": [], - "outputPath": "" - } - }, - "condition": {}, - "editorSetting": { - "tabIndent": "tab", - "tabSize": 4 - }, - "projectname": "miniProgram-wx" +{ + "appid": "youAppID", + "compileType": "miniprogram", + "libVersion": "2.32.3", + "packOptions": { + "ignore": [], + "include": [] + }, + "setting": { + "urlCheck": false, + "coverView": true, + "es6": true, + "postcss": true, + "minified": true, + "enhance": true, + "showShadowRootInWxmlPanel": true, + "packNpmRelationList": [], + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + } + }, + "condition": {}, + "editorSetting": { + "tabIndent": "tab", + "tabSize": 4 + }, + "projectname": "miniProgram-wx" } \ No newline at end of file diff --git a/assets/page-i18n/QuickStart_html/en-US.js b/assets/page-i18n/QuickStart_html/en-US.js index fbbf919b..c7415b96 100644 --- a/assets/page-i18n/QuickStart_html/en-US.js +++ b/assets/page-i18n/QuickStart_html/en-US.js @@ -256,10 +256,6 @@ i18n.put(putSet, ,"8Z8O:"+ //no args "does not support audio recording" -//@@zh="本页面的js资源采用的CDN不稳定,已切换到:" -,"1YEb:"+ //no args - "The CDN used by the js resources on this page is unstable and has been switched to: " - //@@zh="页面已准备好,请先点击打开录音,然后点击录制" ,"BL9u:"+ //no args "The page is ready, please click to open the recording first, then click the Start recording" diff --git a/assets/page-i18n/app_QuickStart_html/en-US.js b/assets/page-i18n/app_QuickStart_html/en-US.js index 3be939ab..4ba714a8 100644 --- a/assets/page-i18n/app_QuickStart_html/en-US.js +++ b/assets/page-i18n/app_QuickStart_html/en-US.js @@ -252,10 +252,6 @@ i18n.put(putSet, ,"EA2M:"+ //no args " file to your (https) website, and you can start testing normally without other files; this file is more suitable for introductory learning" -//@@zh="本页面的js资源采用的CDN不稳定,已切换到:" -,"LiG4:"+ //no args - "The CDN used by the js resources on this page is unstable and has been switched to: " - //@@zh="AppUseH5选项变更,已重置RecordApp,请先进行权限测试" ,"Xvin:"+ //no args "AppUseH5 option changed, RecordApp has been reset, please test permissions first" diff --git a/assets/page-i18n/app_index_html/en-US.js b/assets/page-i18n/app_index_html/en-US.js index ee82ac4d..637d3f2f 100644 --- a/assets/page-i18n/app_index_html/en-US.js +++ b/assets/page-i18n/app_index_html/en-US.js @@ -180,9 +180,13 @@ i18n.put(putSet, ,"Hyuy:"+ //no args "Take over the encoder output (takeoffEncodeChunk)" -//@@zh="模拟实时编码传输(H5版语音通话聊天),发送间隔" +//@@zh="尝试启用回声消除(echoCancellation)" +,"Kz8D:"+ //no args + "Try enabling echoCancellation" + +//@@zh="实时语音通话聊天对讲(WebSocket、WebRTC)" ,"zb16:"+ //no args - "(Chinese) Simulate real-time encoding transmission (H5 version voice call chat), sending interval" + "(Chinese) Real-time voice calls, chats, intercoms (WebSocket, WebRTC)" //@@zh="实时语音识别、音频文件转文字,ASR" ,"jCKC:"+ //no args @@ -216,6 +220,62 @@ i18n.put(putSet, ,"Pea3:"+ //no args "If you need custom development of recording functions, websites, apps, miniProgram, front-end and back-end development, etc., please join the Tencent QQ group: ①group 781036591、②group 748359095、③group 450721519, password recorder, contact the group owner (ie the author), thank you~" +//@@zh="音乐播放测试 :" +,"2fWL:"+ //no args + "Music playback test :" + +//@@zh="合成5分钟mp3" +,"uad6:"+ //no args + "Generate 5 minutes mp3" + +//@@zh="Audio对录音的影响测试" +,"z9o0:"+ //no args + "Audio's influence test on recording" + +//@@zh=";低版本iOS Safari如果未开始过录音并且播放了音乐,然后后续录音可能会有问题;再现方法" +,"yStv:"+ //no args + "; If the lower version of iOS Safari has not started recording and played music, then there may be problems with subsequent recordings; reproduction method" + +//@@zh="刷新页面后首先先播放音乐,然后开始测试录音,会发现波形显示掉帧或者保持直线。另测试浏览器对音频的支持情况。" +,"4yox:"+ //no args + "After refreshing the page, first play the music first, and then start the test recording, and you will find that the waveform shows frame drop or keeps a straight line. Also test the browser's support for audio. " + +//@@zh="视频播放测试 :" +,"fFQq:"+ //no args + "Video playback test :" + +//@@zh="播放mp4" +,"6E53:"+ //no args + "Play mp4" + +//@@zh="Video对录音的影响测试" +,"ALiC:"+ //no args + "Test of the influence of Video on recording" + +//@@zh=";iOS Safari可能出现先播放视频,然后再开始录音,会自动播放视频的声音,但并未再现。" +,"yshJ:"+ //no args + "; iOS Safari may appear to play the video first, and then start recording, and the sound of the video will be played automatically, but it is not reproduced. " + +//@@zh="显示video" +,"CwnP:"+ //no args + "Display Video" + +//@@zh="隐藏video" +,"nFEO:"+ //no args + "Hide Video" + +//@@zh="移除video" +,"WXIx:"+ //no args + "Remove Video" + +//@@zh="循环播放" +,"iXZv:"+ //no args + "Loop Playback" + +//@@zh="静音循环播放" +,"2RpC:"+ //no args + "Mute Loop" + //@@zh="浏览器环境情况 :" ,"IClu:"+ //no args "Browser environment :" @@ -244,6 +304,10 @@ i18n.put(putSet, ,"LnQj:"+ //no args "Start requesting permissions..." +//@@zh="已启用audioTrackSet配置:" +,"W5dU:"+ //no args + "AudioTrackSet configuration enabled: " + //@@zh="已授权" ,"wnd4:"+ //no args "Permission granted" @@ -400,6 +464,10 @@ i18n.put(putSet, ,"v8S9:"+ //no args "Transcoding to wav failed: " +//@@zh="正在合成mp3..." +,"q2iG:"+ //no args + "Generating mp3..." + //@@zh="请先录音,然后停止后再播放" ,"U3nx:"+ //no args "Please record first, then stop and play" diff --git a/assets/page-i18n/index_html/en-US.js b/assets/page-i18n/index_html/en-US.js index f1f32fa0..92f9263f 100644 --- a/assets/page-i18n/index_html/en-US.js +++ b/assets/page-i18n/index_html/en-US.js @@ -160,9 +160,13 @@ i18n.put(putSet, ,"AWXs:"+ //no args "Take over the encoder output (takeoffEncodeChunk), and the newly opened recording takes effect after switching" -//@@zh="模拟实时编码传输(H5版语音通话聊天),发送间隔" +//@@zh="尝试启用回声消除(echoCancellation)" +,"vIzT:"+ //no args + "Try enabling echoCancellation" + +//@@zh="实时语音通话聊天对讲(WebSocket、WebRTC)" ,"SUfw:"+ //no args - "(Chinese) Simulate real-time encoding transmission (H5 version voice call chat), sending interval" + "(Chinese) Real-time voice calls, chats, intercoms (WebSocket, WebRTC)" //@@zh="实时语音识别、音频文件转文字,ASR" ,"lvN7:"+ //no args @@ -468,6 +472,10 @@ i18n.put(putSet, ,"gqjM:"+ //no args "Music playback test :" +//@@zh="合成5分钟mp3" +,"t0I5:"+ //no args + "Generate 5 minutes mp3" + //@@zh="Audio对录音的影响测试" ,"XHIP:"+ //no args "Audio's influence test on recording" @@ -720,6 +728,10 @@ i18n.put(putSet, ,"ywQN:"+ //no args "Transcoding to wav failed: " +//@@zh="正在合成mp3..." +,"EmcW:"+ //no args + "Generating mp3..." + //@@zh="请先录音,然后停止后再播放" ,"zGph:"+ //no args "Please record first, then stop and play" diff --git a/assets/runtime-codes/lib.js-binary-bytes.js b/assets/runtime-codes/lib.js-binary-bytes.js index b4d043d5..446eb05e 100644 --- a/assets/runtime-codes/lib.js-binary-bytes.js +++ b/assets/runtime-codes/lib.js-binary-bytes.js @@ -51,6 +51,14 @@ var Export=Recorder; //可以整个代码复制过去使用,删掉这句(结 //var Export={}; export default Export; //import使用:import JsBinary from './copy.js' +//=======TypedArray二进制拼接合并====== + /*直接创建一个大的数组,调用set方法将两个小数组填充进去即可,下面Int16Array换成Uint8Array等其他TypedArray也是一样的 + var pcm1=new Int16Array([1,2]),pcm2=new Int16Array([3,4,5,6]); //待合并的两个数组 + var pcm=new Int16Array(pcm1.length+pcm2.length); //创建一个新的大数组 + pcm.set(pcm1,0); //写入pcm1到开头位置 + pcm.set(pcm2,pcm1.length); //写入pcm2到pcm1后面,完成拼接 + */ + //=======ArrayBuffer 和 TypedArray 互转(Uint8Array Int8Array Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array)====== //【用 arr=new Int16Array(arrayBuffer) 就能创建TypedArray】无需编写转换函数 //【用 arr.buffer 就是 ArrayBuffer】无需编写转换函数 diff --git a/assets/use_webrtc.png b/assets/use_webrtc.png index bfbd70be6a9ab8b0db050fe321652c77120f0078..1fb35d11e3dcbfa7fbd754e82f640c59e21c43a8 100644 GIT binary patch literal 52558 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 Ef>4DV<^TWy literal 163348 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

7nUZrEKI;9caCqYvz`(* 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 v+=(h<10?"0":"")+h+":"; + v+=(m<10?"0":"")+m+":"; + v+=(s<10?"0":"")+s; + if(showSS)v+="″"+("00"+ss).substr(-3);; + return v; + } + ,checkSet:function(api){ + if(api==2){ + this.wsApi=$(".rtVoice_input_ws").val(); + if(!/^wss?:\/\/.+/i.test(this.wsApi) || /局域网/.test(this.wsApi)){ + this.log("请配置ws地址,比如填写:ws://127.0.0.1:9529/",1); + return false; + } + localStorage["Rec_RtVoice_wsApi"]=this.wsApi; //测试用的存起来 + + this.wsID1=$(".rtVoice_input_wsID1").val(); + if(!this.wsID1){ + this.log("请填写我的标识"); + return false; + } + localStorage["Rec_RtVoice_wsID1"]=this.wsID1; //测试用的存起来 + } + return true; + } + + + + //连接websocket + ,wsConnClick:function(){ + if(!this.checkSet(2))return; + this.log("正在连接"+this.wsApi+"..."); + if(this.socket) this.socket.close(); + var sid=this.SID=(this.SID||0)+1; //同步操作 + + this.socketIsOpen=false; + this.socket=new WebSocket(this.wsApi); + this.socket.binaryType="arraybuffer"; + this.socket.onclose=(function(){ + if(sid!=this.SID) return; + this.socketIsOpen=false; + this.log("ws已断开"); + }).bind(this); + this.socket.onerror=(function(e){ + if(sid!=this.SID) return; + this.socketIsOpen=false; + this.log("ws因为错误已断开:"+e.message,1); + }).bind(this); + this.socket.onopen=(function(){ + if(sid!=this.SID) return; + this.socketIsOpen=true; + this.socket.number=1; + this.socket.sendCalls={}; + this.log("ws已连接",2); + + this.ws__sendMessage("setMeta",{uid:this.wsID1},null,null,(function(){ + this.log("ws已绑定标识:"+this.wsID1,2); + }).bind(this),(function(err){ + this.log("ws绑定标识出错:"+err,1); + }).bind(this)); + + this.ws_voiceReceiveCount=0; + this.ws_voiceReceiveSize=0; + this.ws_voiceReceiveDur=0; + this.ws_voiceReceiveDurTxt="00:00"; + this.resetWsSendVoice(); + this.initStreamPlay(); //先初始化播放器 + }).bind(this); + this.socket.onmessage=(function(e){ + if(sid!=this.SID) return; + this.ws__receiveMessage(e.data); + }).bind(this); + } + ,wsDisconnClick:function(){ + if(this.socketIsOpen)this.log("ws正在断开..."); + else this.log("ws未连接"); + if(this.socket) this.socket.close(); + } + //解析处理服务器消息 + ,ws__receiveMessage:function(rawMsg){ + var binary=new Uint8Array(0),rawTxt=rawMsg;//纯文本消息 + if (rawMsg instanceof ArrayBuffer) {//二进制内容,提取第一行文本 + var bytes=new Uint8Array(rawMsg); + var str="",bIdx=bytes.length; + for(var i=0;inewBufferIdx){ + chunk=null; //重新录音了,重置环境 + } + lastIdx=newBufferIdx; + + //借用SampleData函数进行数据的连续处理,采样率转换是顺带的,得到新的pcm数据 + chunk=Recorder.SampleData(buffers,sampleRate,16000,chunk); + var pcm=chunk.data; + + //二进制pcm + var bytes=new Uint8Array(pcm.buffer); + + //发送pcm出去 + this.ws__sendMessage("sendTo",{ + toMetaKey:"uid",toMetaValue:this.wsID2 //接收方信息,可以是群组(群组的需控制同时只能一人发,否则多人得服务器端混流) + ,sendType:"custom_voiceFrame",sendData:{ + fromMetaKey:"uid",fromMetaValue:this.wsID1//告诉对方是我发的信息 + ,sampleRate:16000 //采样率 + } + },bytes,null,(function(data){ + this.ws_voiceSendUserCount=data.count; + if(data.count){ + this.ws_voiceSendOKCount++; + }else{ //没有接收方 + this.ws_voiceSendErrCount++; + } + this.ws_voiceSendSize+=pcm.byteLength; + this.ws_voiceSendDur=Math.round(this.ws_voiceSendSize/2/16000*1000); + this.ws_voiceSendDurTxt=this.formatTime(this.ws_voiceSendDur); + this.setData(); + }).bind(this)); + }).bind(this); + this.resetWsSendVoice(); + } + ,resetWsSendVoice:function(){ + this.ws_voiceSendUserCount=0; + this.ws_voiceSendOKCount=0; + this.ws_voiceSendErrCount=0; + this.ws_voiceSendSize=0; + this.ws_voiceSendDur=0; + this.ws_voiceSendDurTxt="00:00"; + this.setData(); + } + //结束语音通话对讲 + ,wsCloseVoiceClick:function(){ + window.RtVoiceProcess=null; + this.log("我方已结束语音发送"); + } + //收到对方发来的自定义类型的语音数据 + ,onMsg__custom_voiceFrame:function(data,binary,msgObj){ + var pcm=new Int16Array(binary.buffer); + this.ws_voiceReceiveCount++; + this.ws_voiceReceiveSize+=binary.length; + this.ws_voiceReceiveDur=Math.round(this.ws_voiceReceiveSize/2/data.sampleRate*1000); + this.ws_voiceReceiveDurTxt=this.formatTime(this.ws_voiceReceiveDur); + this.setData(); + + this.streamPlay(pcm,data.sampleRate); + } + + + //播放实时的语音流 + ,streamPlay:function(pcm,sampleRate){ + this.initStreamPlay(); + if(sampleRate!=16000){ console.warn("未适配非16000采样率的pcm播放"); return; } + + var sp=this.wsStreamPlay; + if(!sp || !sp.__isStart) return; + sp.input(pcm); + } + //初始化播放器 + ,initStreamPlay:function(){ + if(this.spIsInit)return; //已初始化完成 + if(this.wsStreamPlay) return True(); + var Tag="wsStreamPlay"; + var sp=Recorder.BufferStreamPlayer({ + decode:false,sampleRate:16000 + ,onInputError:function(errMsg, inputIndex){ + console.error(Tag+"第"+inputIndex+"次的音频片段input输入出错: "+errMsg); + } + ,onPlayEnd:function(){ + // 没有可播放的数据了,缓冲中 或者 已播放完成 + } + }); + sp.start((function(){ + console.log(Tag+"已打开播放"); + sp.__isStart=true; + this.wsStreamPlay=sp; + this.spIsInit=true; + this.log("streamPlay已打开",2); + }).bind(this),(function(err){ + this.log("streamPlay初始化错误:"+err,1); + }).bind(this)); + } +}; +window.RtVoiceObj=new PageObject(); + + + +/***显示界面***/ +var isShow=false; +window.rtVoiceOnShow=function(){ + if(isShow) return; isShow=true; + + $(".rtVoiceView").html('\ +

\ +
\ + WebSocket语音通话聊天\ + 源码: /assets/zdemo.index.realtime_voice.js\ +
\ +\ +
\ +
ws(s):
\ +
需要先在电脑上运行Recorder仓库\ + /assets/node-localServer\ + 内的nodejs服务器端脚本,然后填写你电脑局域网ip即可测试(用127.0.0.1时可用ws),支持ws、wss测试WebSocket地址
\ + \ +
\ + 我的标识\ + \ + \ + \ +
\ +
\ +\ +
\ +
服务器将pcm片段实时发送给客户端,模拟播放语音流
\ + \ + \ + \ +
\ +
\ +\ +
\ +
语音通话聊天对讲,请在上面进行录音操作,音频数据会实时传送给对方播放(实时pcm)
\ + 对方标识\ + \ + \ + \ +
\ +
\ +
\ +\ +
\ +\ +
\ +
发语音和文本消息(简单演示,需先连接)
\ +
\ +
\ +
按住发语音
\ + \ + \ +
\ + \ +
\ +
清屏
\ +
\ +
\ +
\ +
\ + '); + + var wsApi=localStorage["Rec_RtVoice_wsApi"]||"ws://127.0.0.1:9529/ws123"; + $(".rtVoice_input_ws").val(wsApi); + + $(".rtVoice_input_wsID1").val(localStorage["Rec_RtVoice_wsID1"]||1); + $(".rtVoice_input_wsID2").val(localStorage["Rec_RtVoice_wsID2"]||2); + + bindTouch(); +}; + + +/***发语音和文本消息***/ +//长按发语音 +var rtvoiceStart=false; +var bindTouch=function(){ + DemoFragment.BindTouchButton("rtvoiceVoiceBtn" + ,"按住发语音" + ,"松开结束录音" + ,{upBG:"#0b1",downBG:"#fa0"} + ,function(cancel){//按下回调 + rtvoiceStart=true; + + //开始录音 + var openFn=window.recreq||recopen; + var errEnd=function(err){ + if(err){ + rtvoiceStart=false; + rtmsgView("[错误]"+err,false); + cancel("录音错误"); + return; + }; + }; + openFn(function(err){ + if(err) errEnd(err); + else recstart(errEnd); + }); + } + ,function(isCancel,isUser){//结束长按回调 + if(rtvoiceStart && !isCancel){ + //结束录音 + recstop(function(err,data){ + rtvoiceStart=false; + if(!isUser){ + rtmsgView("[事件]touch事件被打断",false); + return; + }; + if(err){ + rtmsgView("[错误]"+err,false); + return; + }; + + RtVoiceObj.rtvoiceMsgSend(data.data, data.duration); + }); + }; + } + ); +}; + +var rtmsgTime=function(){ + var d=new Date(); + return ''+("0"+d.getMinutes()).substr(-2)+"′"+("0"+d.getSeconds()).substr(-2)+" "; +}; +var rtmsgView=function(msg,isIn){ + var id=RandomKey(16); + $(".rtvoiceMsgBox").prepend('
'+rtmsgTime()+msg.replace(/[<>&]/g,function(a){return "&#"+a.charCodeAt(0)+";"}).replace(/ /g," ").replace(/[\r\n]/g,"
")+'
'); + return id; +}; +var rtvoiceView=function(data,isIn){ + var id=RandomKey(16); + rtvoiceDatas[id]=data; + $(".rtvoiceMsgBox").prepend('
'+rtmsgTime()+'语音 '+(data.duration/1000).toFixed(2)+'s
'); + return id; +}; +var rtvoiceDatas={}; +RtVoiceObj.rtvoicePlay=function(id){ + var audio=$(".recPlay")[0]; + audio.style.display="inline-block"; + if(!(audio.ended || audio.paused)){ + audio.pause(); + }; + audio.src=(window.URL||webkitURL).createObjectURL(rtvoiceDatas[id].data); + audio.play(); +}; + + +//发送语音消息给对方 +RtVoiceObj.rtvoiceMsgSend=function(blob,duration){ + var msgId=rtvoiceView({data:blob, duration:duration},false); + $("."+msgId+"_s").html("发送中"); + var revCount=0; + var msgEnd=function(err){ + if(err){ + $("."+msgId+"_s").html("发送失败"); + rtmsgView("[语音未发送]"+err,false); + return; + } + $("."+msgId+"_s").html("已发"+revCount+"人"); + }; + var err=this.readWsID2(); if(err) return msgEnd(err); + + var reader = new FileReader(); + reader.onloadend = (function() { + var bytes=new Uint8Array(reader.result); + + this.ws__sendMessage("sendTo",{ + toMetaKey:"uid",toMetaValue:this.wsID2 + ,sendType:"custom_voiceMsg",sendData:{ + fromMetaKey:"uid",fromMetaValue:this.wsID1//告诉对方是我发的信息 + ,mime:blob.type, duration:duration + } + },bytes,null,(function(data){ + revCount=data.count; + if(!data.count){//没有接收方 + msgEnd("对方"+this.wsID2+"不在线"); + return; + }; + msgEnd(""); + }).bind(this),(function(err){ + msgEnd(err); + }).bind(this)); + }).bind(this); + reader.readAsArrayBuffer(blob); +}; +//收到对方发来的语音消息 +RtVoiceObj.onMsg__custom_voiceMsg=function(data,binary,msgObj){ + rtvoiceView({data:new Blob([binary], {type:data.mime}), duration:data.duration},true); +}; + + +//发送文本消息 +RtVoiceObj.rtTxtMsgSend=function(txt){ + var input=$(".rtvoiceMsgInput"); + txt=txt||input.val(); + var msgId=rtmsgView(txt,false); + $("."+msgId+"_s").html("发送中"); + var revCount=0; + var msgEnd=function(err){ + if(err){ + $("."+msgId+"_s").html("发送失败"); + rtmsgView("[消息未发送]"+err,false); + return; + } + $("."+msgId+"_s").html("已发"+revCount+"人"); + }; + var err=this.readWsID2(); if(err) return msgEnd(err); + + this.ws__sendMessage("sendTo",{ + toMetaKey:"uid",toMetaValue:this.wsID2 + ,sendType:"custom_txtMsg",sendData:{ + fromMetaKey:"uid",fromMetaValue:this.wsID1//告诉对方是我发的信息 + ,txt:txt + } + },null,null,(function(data){ + revCount=data.count; + if(!data.count){//没有接收方 + msgEnd("对方"+this.wsID2+"不在线"); + return; + }; + input.val(""); + msgEnd(""); + }).bind(this),(function(err){ + msgEnd(err); + }).bind(this)); +}; +//收到对方发来的文本消息 +RtVoiceObj.onMsg__custom_txtMsg=function(data,binary,msgObj){ + rtmsgView(data.txt,true); +}; + + +})(); \ No newline at end of file diff --git a/assets/zdemo.index.webrtc.js b/assets/zdemo.index.webrtc.js index 9b4175f7..828afd9c 100644 --- a/assets/zdemo.index.webrtc.js +++ b/assets/zdemo.index.webrtc.js @@ -15,14 +15,27 @@ loadJsList([//加载依赖的js ,check:function(){return !window.DemoFragment||!DemoFragment.BindTouchButton}} ],function(){ reclog("需要的js加载完成"); - jsLoadEnd(); bindTouch(); + rtConnModeClick(); },function(err){ reclog(err,1); }); +window.rtConnModeIsWS=true; +window.rtConnModeClick=function(){ + var isWS=$(".rtConnMode_ws")[0].checked; + rtConnModeIsWS=isWS; + $(".rtVoiceView")[isWS?"show":"hide"](); + $(".webrtcView")[!isWS?"show":"hide"](); + + if(isWS){ + rtVoiceOnShow(); + }else{ + webrtcTips(); webrtcTips=function(){}; + } +}; -var jsLoadEnd=function(){ - reclog("↑↑↑按上面的步骤使用↑↑↑"); +var webrtcTips=function(){ + reclog("↑↑↑WebRTC按上面的步骤使用↑↑↑"); reclog("实时编码未使用takeoffEncodeChunk实现时:除wav、pcm格式外发送间隔尽量不要低于编码速度速度,除wav、pcm外其他格式编码结果可能会比实际的PCM结果音频时长略长或略短,如果涉及到实时解码应留意此问题,长了的时候可截断首尾使解码后的PCM长度和录音的PCM长度一致(可能会增加噪音)使用takeoffEncodeChunk实现时无此限制(在上面勾选“接管编码器输出”即可开启使用);参考【教程】【音频流】【上传】实时转码并上传-mp3专版。"); @@ -45,13 +58,24 @@ var jsLoadEnd=function(){ ,'**************
' ].join("
")); - reclog("↓↓↓按下面的步骤使用↓↓↓"); + reclog("↓↓↓WebRTC按下面的步骤使用↓↓↓"); }; - - $(".webrtcView").html(["" + + $(".realTimeSendView").html(["" +,'
' +,' 传输通道:' +,' ' +,' ' +,'
' +,'
' + +,'' + +,'