From fc8d4ba458daa973ddbdec8d0bc010a18ba48ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=B9=E6=9E=9C=E7=94=B5=E8=84=91?= Date: Sat, 28 Feb 2026 09:05:28 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8B=B9=E6=9E=9C=E7=94=B5=E8=84=91=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E4=B8=80=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .hbuilderx/launch.json | 4 + .../UserInterfaceState.xcuserstate | Bin 96174 -> 93282 bytes src/common/permission.js | 8 +- src/components/touch-btn/touch-btn.vue | 110 ++++--- src/pages/index/dialog.vue | 4 +- src/pages/login/login.vue | 4 +- .../ty-camera/utssdk/app-ios/index.uts | 85 ----- .../utssdk/app-ios/index copy.uts | 251 +++++++++++++++ .../ty-recording/utssdk/app-ios/index.uts | 293 ++++++++++++++---- .../ty-recording/utssdk/interface.uts | 3 +- 10 files changed, 554 insertions(+), 208 deletions(-) create mode 100644 src/uni_modules/ty-recording/utssdk/app-ios/index copy.uts diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json index b7f2bc25..eb3df681 100644 --- a/.hbuilderx/launch.json +++ b/.hbuilderx/launch.json @@ -7,7 +7,11 @@ "type" : "uni-app:app-android" }, { + "bundleId" : "cn.com.jlbank.aits", + "certificateFile" : "/Users/jlbank/Desktop/tra-app/certificate/ios/开发证书.p12", + "certificateProfileFile" : "/Users/jlbank/Desktop/tra-app/certificate/ios/jiaixuedev.mobileprovision", "playground" : "standard", + "runSignStatus" : 1, "type" : "uni-app:app-ios" } ] diff --git a/Ios/HBuilder-Hello/HBuilder-Hello.xcodeproj/project.xcworkspace/xcuserdata/jlbank.xcuserdatad/UserInterfaceState.xcuserstate b/Ios/HBuilder-Hello/HBuilder-Hello.xcodeproj/project.xcworkspace/xcuserdata/jlbank.xcuserdatad/UserInterfaceState.xcuserstate index 6a7028fdf1f45b2d3b11ef25c12f32baaceeabc9..083859e187e1f1aea332683130399ad08a4be2b3 100644 GIT binary patch literal 93282 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ξGaP2dF|v_xyPLq`n4B+LQJnN4i7mw~uu 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 diff --git a/src/common/permission.js b/src/common/permission.js index 70571bd5..2d62c0be 100644 --- a/src/common/permission.js +++ b/src/common/permission.js @@ -75,8 +75,8 @@ function judgeIosPermissionRecord() { console.log('麦克风state', state); switch (state) { case 'authorized': - console.log("麦克风权限是否开启"); - resolve() + console.log("麦克风权限已经开启"); + resolve('authorized') break; case 'denied': // ios拒绝,安卓拒绝或者未授权都是这个 if (IsAndEnv) { // 安卓二次判定 @@ -94,10 +94,10 @@ function judgeIosPermissionRecord() { // 前往权限设置页面 uni.openAppAuthorizeSetting(); } - reject() + reject(new Error('前往权限设置页面用户点击了否')) break; case 'not determined': // 表示尚未请求授权,仅 iOS 会出现。此种情况下引导用户打开系统设置,不展示开关 - resolve() + resolve('not determined') break; case 'config error': // 只有在 App 端时返回 resolve() diff --git a/src/components/touch-btn/touch-btn.vue b/src/components/touch-btn/touch-btn.vue index 851668e8..adc64619 100644 --- a/src/components/touch-btn/touch-btn.vue +++ b/src/components/touch-btn/touch-btn.vue @@ -96,12 +96,13 @@ import { wsUrl, bottomAreaTopBoundary, horizontalSplitX } from './touch-btn'; import { ref, computed, onMounted, nextTick, watch, reactive } from 'vue'; import common from '@/common/common'; - import { onHide } from '@dcloudio/uni-app'; + import { onHide, onLaunch } from '@dcloudio/uni-app'; import { getPhoneEnvBool, getToken } from '@/common/common.js'; - import { startAudioRecord, stopAudioRecord } from '@/uni_modules/ty-recording'; + import { startAudioRecord, stopAudioRecord,preRequestRecordPermission } from '@/uni_modules/ty-recording'; import { ProtocolCodec, MessageType, ControlCommand, ControlCode } from '@/pages/sparring/js/ProtocolCodec'; import permissionApi from '@/common/permission'; - + + const emit = defineEmits(['submit']); const ws = ref(null); const status = ref('voice'); @@ -166,7 +167,11 @@ // 开启语音 const startRecord = async (obj) => { try { - await permissionApi.judgeIosPermission('record'); + const state = await permissionApi.judgeIosPermission('record'); + if(state === 'not determined') { + preRequestRecordPermission(() => {}) + return; + } } catch (e) { console.error('麦克风权限申请失败:', e); return; @@ -174,54 +179,61 @@ const changedTouche = obj.touches[0]; touchPos.x = changedTouche.clientX; touchPos.y = changedTouche.clientY; - ws.value = uni.connectSocket({ - url: wsUrl + '?summary=' + getToken(), - fail: () => {}, - success: () => {} - }); - ws.value.onOpen((res) => { - console.log('ws已连接'); - popupRef.value.open(); - startAudioRecord({ - onFrame: (pcmData) => { - console.log(pcmData); - ws.value.send({ - data: ProtocolCodec.pack(MessageType.AUDIO_DATA, pcmData) - }); - }, - onStart: ({ startTime }) => { - console.log('开始', startTime); - }, - onStop: () => { - console.log('关闭'); - }, - onError: ({ errCode, errMsg }) => { - if (errCode === 9010001) { - console.log(errMsg); - } + popupRef.value.open(); + startAudioRecord({ + onFrame: (pcmData: any) => { + console.log('pcmData', pcmData); + // console.log('pcmData', pcmData.length); + // ws.value.send({ + // data: ProtocolCodec.pack(MessageType.AUDIO_DATA, pcmData) + // }); + }, + onStart: (res: any) => { + console.log('启动', res); + + }, + onStop: () => { + console.log('关闭'); + }, + onError: ({ errCode, errMsg }) => { + console.log('onError',errMsg); + if (errCode === 9010001) { + console.log(errMsg); } - }); - }); - ws.value.onError((err) => { - console.log('err', err); - }); - ws.value.onClose((err) => { - console.log('onClose', err); - }); - ws.value.onMessage((res) => { - try { - const { msgType, body } = ProtocolCodec.unpack(res.data); - console.log('来消息了', msgType, body); - if (msgType === MessageType.TEXT_MESSAGE) { - tempText.value = ''; - allText.value = allText.value + body; - } else if (msgType === MessageType.TIP_MESSAGE) { - tempText.value = body; - } - } catch (e) { - console.log('后端发来的信息有问题'); } }); + + + // ws.value = uni.connectSocket({ + // url: wsUrl + '?summary=' + getToken(), + // fail: () => {}, + // success: () => {} + // }); + // ws.value.onOpen((res) => { + // console.log('ws已连接'); + // popupRef.value.open(); + + // }); + // ws.value.onError((err) => { + // console.log('err', err); + // }); + // ws.value.onClose((err) => { + // console.log('onClose', err); + // }); + // ws.value.onMessage((res) => { + // try { + // const { msgType, body } = ProtocolCodec.unpack(res.data); + // console.log('来消息了', msgType, body); + // if (msgType === MessageType.TEXT_MESSAGE) { + // tempText.value = ''; + // allText.value = allText.value + body; + // } else if (msgType === MessageType.TIP_MESSAGE) { + // // tempText.value = body; + // } + // } catch (e) { + // console.log('后端发来的信息有问题'); + // } + // }); }; // 关掉遮罩层 const closePopup = () => { diff --git a/src/pages/index/dialog.vue b/src/pages/index/dialog.vue index 318194b6..b369bf04 100644 --- a/src/pages/index/dialog.vue +++ b/src/pages/index/dialog.vue @@ -163,8 +163,10 @@ onShow, onUnload, onHide, - onBackPress + onBackPress, + onLaunch } from '@dcloudio/uni-app'; + import { get_base_url, goto_login_fun diff --git a/src/pages/login/login.vue b/src/pages/login/login.vue index 10e9cae3..a32f4051 100644 --- a/src/pages/login/login.vue +++ b/src/pages/login/login.vue @@ -81,8 +81,8 @@ const socketStore = useSocketStore(); const { taskSocket } = storeToRefs(socketStore); const show_password = ref(false); - const account = ref(''); - const password = ref(''); + const account = ref('admin'); + const password = ref('123456'); const read_text_state = ref>([]); const imeHeight = ref('0px'); const back_state = ref(true); diff --git a/src/uni_modules/ty-camera/utssdk/app-ios/index.uts b/src/uni_modules/ty-camera/utssdk/app-ios/index.uts index c24f8c2c..e69de29b 100644 --- a/src/uni_modules/ty-camera/utssdk/app-ios/index.uts +++ b/src/uni_modules/ty-camera/utssdk/app-ios/index.uts @@ -1,85 +0,0 @@ -/** - * 引用 iOS 系统库,示例如下: - * import { UIDevice } from "UIKit"; - * [可选实现,按需引入] - */ - -/* 引入 interface.uts 文件中定义的变量 */ -import { MyApiOptions, MyApiResult, MyApi, MyApiSync } from '../interface.uts'; - -/* 引入 unierror.uts 文件中定义的变量 */ -import { MyApiFailImpl } from '../unierror'; - -/** - * 引入三方库 - * [可选实现,按需引入] - * - * 在 iOS 平台引入三方库有以下两种方式: - * 1、通过引入三方库framework 或者.a 等方式,需要将 .framework 放到 ./Frameworks 目录下,将.a 放到 ./Libs 目录下。更多信息[详见](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#ios-平台原生配置) - * 2、通过 cocoaPods 方式引入,将要引入的 pod 信息配置到 config.json 文件下的 dependencies-pods 字段下。详细配置方式[详见](https://uniapp.dcloud.net.cn/plugin/uts-ios-cocoapods.html) - * - * 在通过上述任意方式依赖三方库后,使用时需要在文件中 import: - * 示例:import { LottieLoopMode } from 'Lottie' - */ - -/** - * UTSiOS 为平台内置对象,不需要 import 可直接调用其API,[详见](https://uniapp.dcloud.net.cn/uts/utsios.html) - */ - -/** - * 异步方法 - * - * uni-app项目中(vue/nvue)调用示例: - * 1、引入方法声明 import { myApi } from "@/uni_modules/uts-api" - * 2、方法调用 - * myApi({ - * paramA: false, - * complete: (res) => { - * console.log(res) - * } - * }); - * - */ -export const myApi : MyApi = function (options : MyApiOptions) { - - if (options.paramA == true) { - // 返回数据 - const res : MyApiResult = { - fieldA: 85, - fieldB: true, - fieldC: 'some message' - }; - options.success?.(res); - options.complete?.(res); - - } else { - // 返回错误 - let failResult = new MyApiFailImpl(9010001); - options.fail?.(failResult) - options.complete?.(failResult) - } - -} - -/** - * 同步方法 - * - * uni-app项目中(vue/nvue)调用示例: - * 1、引入方法声明 import { myApiSync } from "@/uni_modules/uts-api" - * 2、方法调用 - * myApiSync(true); - * - */ -export const myApiSync : MyApiSync = function (paramA : boolean) : MyApiResult { - // 返回数据,根据插件功能获取实际的返回值 - const res : MyApiResult = { - fieldA: 85, - fieldB: paramA, - fieldC: 'some message' - }; - return res; -} - -/** - * 更多插件开发的信息详见:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html - */ diff --git a/src/uni_modules/ty-recording/utssdk/app-ios/index copy.uts b/src/uni_modules/ty-recording/utssdk/app-ios/index copy.uts new file mode 100644 index 00000000..32f903d1 --- /dev/null +++ b/src/uni_modules/ty-recording/utssdk/app-ios/index copy.uts @@ -0,0 +1,251 @@ +import { StartAudioRecordOptions } from '../interface.uts'; +import { StartAudioRecordFailImpl, AudioErrorCode } from '../unierror.uts'; + + +import { UTSiOS } from "DCloudUTSFoundation" +import { AVAudioEngine, AVAudioSession, AVAudioFormat, AVAudioInputNode, AVAudioPCMBuffer, AVAudioCommonFormat } from "AVFoundation"; +import { NSData, NSMutableData } from "Foundation"; +import { Int, Int16 } from 'Swift'; + +// @argumentLabel("forBus") +/** + * 音频采集状态(全局变量,保证生命周期) + */ +let isRecording = false; +/** + * 音频引擎实例(全局变量,避免异步回调中被释放) + */ +let audioEngine: AVAudioEngine | null = null; +/** + * 音频输入节点(全局变量,避免被释放) + */ +let inputNode: AVAudioInputNode | null = null; +// 全局复用缓冲区(避免每次创建新数组) +let reuseInt32Array: Int32Array | null = new Int32Array(4800); +// 新增:缓存录制的所有Int16 PCM数据 +let recordedPCMData: UInt8[] = []; +// 3. 保存完整PCM数据到文件 +const sampleRate = 16000.0; // 和采集时的目标格式一致 +const channels = 1; // 实际以采集时的声道数为准(可从inputFormat获取) + +/** + * 启动音频采集(iOS端核心实现) + * @param options 采集配置及回调 + */ +@UTSJS.keepAlive +export function startAudioRecord(options: StartAudioRecordOptions): void { + // 避免重复启动 + console.log('避免重复启动', isRecording); + // if (isRecording) return; + + try { + recordedPCMData = []; + const audioSession = AVAudioSession.sharedInstance(); + UTSiOS.try(audioSession.setCategory( + AVAudioSession.Category.playAndRecord, + mode=AVAudioSession.Mode.spokenAudio, + options= AVAudioSession.CategoryOptions.duckOthers // 可选:其他音频静音 + )); + // UTSiOS.try(audioSession.setCategory(AVAudioSession.Category.playAndRecord)); + // UTSiOS.try(audioSession.setMode(AVAudioSession.Mode.spokenAudio)); + UTSiOS.try(audioSession.setActive(true)); + audioSession.requestRecordPermission((granted: boolean) => { + // 闭包内处理权限结果(异步执行) + if (granted) { + // 权限通过:继续初始化采集逻辑 + try { + // 创建音频引擎(移到闭包内,保证权限通过后才执行) + audioEngine = AVAudioEngine.init(); + if (audioEngine === null) { // 解包:先判断是否为nil + throw new Error("音频输入节点为空,无法获取音频格式"); + } + inputNode = audioEngine!.inputNode; + if (inputNode === null) { // 解包:先判断是否为nil + throw new Error("音频输入节点为空,无法获取音频格式"); + } + const unwrappedInputNode = inputNode!; + const inputFormat = unwrappedInputNode.inputFormat(forBus= 0); + console.log("硬件原生采样率:", inputFormat.sampleRate); + console.log("硬件原生声道数:", inputFormat.channelCount); + console.log("硬件原生格式:", inputFormat.commonFormat); + + const targetFormat = AVAudioFormat.init( + commonFormat= AVAudioCommonFormat.pcmFormatInt16, // 16位整型(文档枚举值) + sampleRate= inputFormat.sampleRate, // 采样率(Double类型,符合文档定义) + channels= inputFormat.channelCount, // 声道数(AVAudioChannelCount) + interleaved= false // 是否交错(Bool,单声道无影响) + ); + unwrappedInputNode.installTap( + onBus= 0, // 总线编号,通常传 0 + bufferSize= 2048, // 缓冲区大小,常用 1024/2048 + format= targetFormat, // 音频格式 + block=(buffer: AVAudioPCMBuffer, time: any) => { + const frameLen = buffer.frameLength as number; + const bufferListRawPtr = buffer.audioBufferList; + const audioBufferList = bufferListRawPtr.pointee; // 拿到结构体本身 + const audioBufferPtr = audioBufferList.mBuffers; // AudioBuffer指针 + // // console.log(audioBufferPtr.mData); + const mData = audioBufferPtr.mData; + + // const mDataByteSize:Int = 9600; // 你之前看到的字节数 + // const uint8Ptr = mData!.bindMemory(to= UInt8.self, capacity= mDataByteSize); + // const pcmNormalArray: number[] = []; + // for (let i:Int = 0; i < mDataByteSize; i++) { + // // 直接读取指针的第i个字节,转为0-255的普通数字 + // pcmNormalArray.push(uint8Ptr[i] as number); + // } + // const halfLength:Int = 4800; + // const firstHalf = pcmNormalArray.slice(0, halfLength); + // const secondHalf = pcmNormalArray.slice(halfLength, mDataByteSize); + // options.onFrame?.(firstHalf); + // options.onFrame?.(secondHalf); + + + // options.onFrame?.(pcmNormalArray); + // let uint8 = new Uint8Array([4, 5, 8, 12]); + // let array = Array.from(uint8); + // console.log(array); + // options.onFrame?.(array); + // const audioBuffer = audioBufferPtr.pointee; // 拿到AudioBuffer结构体 + // console.log("音频数据字节数:", audioBuffer.mDataByteSize); // 比如4096(2048帧×2字节) + // console.log("声道数:", audioBuffer.mNumberChannels); // 1 + // console.log("二进制数据指针:", audioBuffer.mData); // 指向16位PCM数据的内存地址 + + // const int16Ptr = buffer.int16ChannelData; + // if (int16Ptr != null && frameLen > 0) { + // const dataPtr = int16Ptr![0]; + // const CHUNK_FRAME_SIZE = frameLen / 2; // 16位=2字节/帧 → 512帧/分片 + // // 关键2:循环拆分 9600 字节为多个小分片 + // for (let startFrame:number = 0; startFrame < frameLen; startFrame += CHUNK_FRAME_SIZE) { + // // 计算当前分片的结束帧(避免越界) + // const endFrame = Math.min(startFrame + CHUNK_FRAME_SIZE, frameLen); + // let _recordedPCMData: UInt8[] = []; + // // 只处理当前分片的帧 + // for (let i: Int = startFrame as Int; i < endFrame; i++) { + // const int16Value = dataPtr[i]; + // let byte1 = UInt8(int16Value & 0xFF); + // let byte2 = UInt8((int16Value >> 8) & 0xFF); + // _recordedPCMData.push(byte1); + // _recordedPCMData.push(byte2); + // } + // options.onFrame?.(_recordedPCMData); + // } + // } + } + ); + UTSiOS.try(audioEngine!.start()); + if (audioEngine!.isRunning) { + console.log("引擎确实处于运行状态"); + isRecording = true; + } else { + console.error("调用 start() 但引擎未运行"); + } + isRecording = true; + } catch (error) { + isRecording = false; + } + } else { + // 权限被拒绝:回调错误 + isRecording = false; + } + }); + isRecording = true; + } catch (error) { + // 初始化失败回调错误 + const err = new StartAudioRecordFailImpl(9010002); + options.onError?.(err); + // 重置状态 + return; + } +} + +/** + * 停止音频采集(配套停止逻辑,保证功能完整) + * @param options 回调配置 + */ + +export function stopAudioRecord(): void { + console.log('停止音频采集'); + if (audioEngine === null) { // 解包:先判断是否为nil + isRecording = false; + return; // 直接返回,不执行后续逻辑 + } + const _audioEngine = audioEngine! + if (_audioEngine.isRunning) { + _audioEngine.stop(); + } + if (inputNode === null) { // 解包:先判断是否为nil + isRecording = false; + return; // 直接返回,不执行后续逻辑 + } + const _inputNode = inputNode! + _inputNode.removeTap(onBus= 0); // 移除音频回调 + console.log('移除音频回调'); + + // 停用音频会话 + const audioSession = AVAudioSession.sharedInstance(); + + try { + UTSiOS.try(audioSession.setActive(false)); + }catch (e) { + console.log(e) + } + console.log('数组大小',recordedPCMData.length); + const filePath = savePCMToFile(recordedPCMData, sampleRate, channels); + console.log('filePath', filePath); + inputNode = null; + audioEngine = null; // 释放全局引擎 + isRecording = false; + +} + +/** + * 将Int16 PCM数组保存为文件(iOS沙盒路径) + * @param pcmData Int16格式的PCM数据 + * @param sampleRate 采样率 + * @param channels 声道数 + * @returns 文件路径 | null + */ +function savePCMToFile(pcmData: UInt8[], sampleRate: number, channels: number): string | null { + try { + const dataPath = UTSiOS.getDataPath(); + console.log('dataPath', dataPath); + if (dataPath === null) { + throw new Error("获取应用数据路径失败"); + } + // 2. 生成唯一文件名(避免覆盖) + const timestamp = new Date().getTime().toString(); + const filePath = dataPath + "/" + "recording_" + timestamp + ".pcm"; + const fileURL = NSURL.fileURL(withPath= filePath); + console.log(fileURL); + + // 3. 将Int16数组转为NSData(字节数据) + const byteCount = pcmData.length * 2; // 每个Int16占2字节 + const byteArray = Uint8Array.from(recordedPCMData); + const dataOptional = NSMutableData(length= byteArray.length); + // const dataOptional = NSMutableData(length= byteCount); + if (dataOptional === null) throw new Error("创建NSMutableData失败"); + const data = dataOptional!; + + for (let j:Int = 0; j < recordedPCMData.length; j++) { + // 获取当前字节值(UInt8) + const byteValue = recordedPCMData[j]; + // 将单个字节写入 NSMutableData 的指定位置 + data.replaceBytes(in = NSMakeRange(j, 1), withBytes= UTSiOS.getPointer(byteValue), length= 1); + } + + + // 4. 写入文件(UTS兼容的Swift风格) + const writeSuccess = data.write(toFile=filePath, atomically= true); + // console.log(data); + if (writeSuccess) { + console.log("PCM文件保存成功:", filePath); + return filePath; + } else { + throw new Error("文件写入失败"); + } + } catch (error) { + console.error("保存PCM文件出错:", error); + return null; + } +} diff --git a/src/uni_modules/ty-recording/utssdk/app-ios/index.uts b/src/uni_modules/ty-recording/utssdk/app-ios/index.uts index 118cff78..e1415b03 100644 --- a/src/uni_modules/ty-recording/utssdk/app-ios/index.uts +++ b/src/uni_modules/ty-recording/utssdk/app-ios/index.uts @@ -3,10 +3,10 @@ import { StartAudioRecordFailImpl, AudioErrorCode } from '../unierror.uts'; import { UTSiOS } from "DCloudUTSFoundation" -import { AVAudioEngine, AVAudioSession, AVAudioFormat, AVAudioInputNode, AVAudioPCMBuffer } from "AVFoundation"; +import { AVAudioEngine, AVAudioSession, AVAudioFormat, AVAudioInputNode, AVAudioPCMBuffer, AVAudioCommonFormat } from "AVFoundation"; import { NSData, NSMutableData } from "Foundation"; +import { Int, Int16 } from 'Swift'; -// @argumentLabel("forBus") /** * 音频采集状态(全局变量,保证生命周期) */ @@ -21,6 +21,57 @@ let audioEngine: AVAudioEngine | null = null; let inputNode: AVAudioInputNode | null = null; // 全局复用缓冲区(避免每次创建新数组) let reuseInt32Array: Int32Array | null = new Int32Array(4800); +// 新增:缓存录制的所有Int16 PCM数据 +let recordedPCMData: UInt8[] = []; +// 3. 保存完整PCM数据到文件 +const sampleRate = 16000.0; // 和采集时的目标格式一致 +const channels = 1; // 实际以采集时的声道数为准(可从inputFormat获取) + +// 新增:录音启动时间戳(毫秒) +let recordStartTime: number | null = null; +// 新增:实时时长定时器(用于更新UI) +let durationTimer: any = null; + +// 预申请权限函数(可在App启动时调用) +/** + * 预申请麦克风权限(规范版,含资源管理) + * @param callback 权限申请结果回调(可选) + */ +export function preRequestRecordPermission(callback?: (granted: boolean) => void) { + const audioSession = AVAudioSession.sharedInstance(); + + try { + // 1. 配置基础音频会话(仅为权限申请,用record类别) + UTSiOS.try(audioSession.setCategory( + AVAudioSession.Category.record, + mode=AVAudioSession.Mode.default + )); + + // 2. 激活会话(权限申请建议激活,避免部分设备弹窗不触发) + UTSiOS.try(audioSession.setActive(true)); + + // 3. 发起权限申请 + audioSession.requestRecordPermission((granted: boolean) => { + console.log("预申请麦克风权限结果:", granted); + + // 4. 权限申请完成后,立即停用会话(核心:释放资源) + try { + UTSiOS.try(audioSession.setActive( + false, + options= AVAudioSession.SetActiveOptions.notifyOthersOnDeactivation + )); + } catch (e) { + console.warn("预申请后停用音频会话失败:", e); + } + + // 5. 回调权限结果(供上层处理) + callback?.(granted); + }); + } catch (error) { + console.error("预申请麦克风权限失败:", error); + callback?.(false); + } +} /** * 启动音频采集(iOS端核心实现) @@ -30,79 +81,136 @@ let reuseInt32Array: Int32Array | null = new Int32Array(4800); export function startAudioRecord(options: StartAudioRecordOptions): void { // 避免重复启动 console.log('避免重复启动', isRecording); - // if (isRecording) return; - + if (isRecording) return; try { + recordedPCMData = new Array(); + // 获取 iOS 系统的音频会话单例对象。 const audioSession = AVAudioSession.sharedInstance(); + // 设置音频会话的类别、模式和附加选项,定义 App 的音频行为。 UTSiOS.try(audioSession.setCategory( AVAudioSession.Category.playAndRecord, mode=AVAudioSession.Mode.spokenAudio, options= AVAudioSession.CategoryOptions.duckOthers // 可选:其他音频静音 )); - // UTSiOS.try(audioSession.setCategory(AVAudioSession.Category.playAndRecord)); - // UTSiOS.try(audioSession.setMode(AVAudioSession.Mode.spokenAudio)); UTSiOS.try(audioSession.setActive(true)); + isRecording = true; audioSession.requestRecordPermission((granted: boolean) => { - // 闭包内处理权限结果(异步执行) - if (granted) { - // 权限通过:继续初始化采集逻辑 - try { - // 创建音频引擎(移到闭包内,保证权限通过后才执行) - audioEngine = AVAudioEngine.init(); - if (audioEngine === null) { // 解包:先判断是否为nil - throw new Error("音频输入节点为空,无法获取音频格式"); + if(!granted){ + try { + UTSiOS.try(audioSession.setActive(false, options= AVAudioSession.SetActiveOptions.notifyOthersOnDeactivation)); + } catch (e) { + console.warn("停用音频会话失败:", e); + } + // 2. 重置状态 + isRecording = false; + const err = new StartAudioRecordFailImpl(9010002); // 麦克风权限被永久拒绝,请前往设置开启 + options.onError?.(err) + } else { + + // 权限通过:继续初始化采集逻辑 + try { + // 创建音频引擎(移到闭包内,保证权限通过后才执行) + audioEngine = AVAudioEngine.init(); + if (audioEngine === null) { // 解包:先判断是否为nil + throw new Error("音频输入节点为空,无法获取音频格式"); + } + inputNode = audioEngine!.inputNode; + if (inputNode === null) { // 解包:先判断是否为nil + throw new Error("音频输入节点为空,无法获取音频格式"); + } + const unwrappedInputNode = inputNode!; + const inputFormat = unwrappedInputNode.inputFormat(forBus= 0); + console.log("硬件原生采样率:", inputFormat.sampleRate); + console.log("硬件原生声道数:", inputFormat.channelCount); + console.log("硬件原生格式:", inputFormat.commonFormat); + recordStartTime = new Date().getTime(); + // 1. 生成录音唯一标识(UUID,方便多录音实例管理) + const recordId = `${new Date().getTime()}-${Math.floor(Math.random() * 10000)}`; + options.onStart?.({ + recordId: recordId, // 唯一标识 + sampleRate: inputFormat.sampleRate, // 采样率 + startTime: recordStartTime, // 启动时间戳 + }); + const targetFormat = AVAudioFormat.init( + commonFormat= AVAudioCommonFormat.pcmFormatInt16, // 16位整型(文档枚举值) + sampleRate= inputFormat.sampleRate, // 采样率(Double类型,符合文档定义) + channels= inputFormat.channelCount, // 声道数(AVAudioChannelCount) + interleaved= false // 是否交错(Bool,单声道无影响) + ); + unwrappedInputNode.installTap( + onBus= 0, // 总线编号,通常传 0 + bufferSize= 2048, // 缓冲区大小,常用 1024/2048 + format= targetFormat, // 音频格式 + block=(buffer: AVAudioPCMBuffer, time: any) => { + const frameLen = buffer.frameLength as number; + const bufferListRawPtr = buffer.audioBufferList; + const audioBufferList = bufferListRawPtr.pointee; // 拿到结构体本身 + const audioBufferPtr = audioBufferList.mBuffers; // AudioBuffer指针 + // // console.log(audioBufferPtr.mData); + const mData = audioBufferPtr.mData; + + // const mDataByteSize:Int = 9600; // 你之前看到的字节数 + // const uint8Ptr = mData!.bindMemory(to= UInt8.self, capacity= mDataByteSize); + // const pcmNormalArray: number[] = []; + // for (let i:Int = 0; i < mDataByteSize; i++) { + // // 直接读取指针的第i个字节,转为0-255的普通数字 + // pcmNormalArray.push(uint8Ptr[i] as number); + // } + // const halfLength:Int = 4800; + // const firstHalf = pcmNormalArray.slice(0, halfLength); + // const secondHalf = pcmNormalArray.slice(halfLength, mDataByteSize); + // options.onFrame?.(firstHalf); + // options.onFrame?.(secondHalf); + + + // options.onFrame?.(pcmNormalArray); + // let uint8 = new Uint8Array([4, 5, 8, 12]); + // let array = Array.from(uint8); + // console.log(array); + // options.onFrame?.(array); + // const audioBuffer = audioBufferPtr.pointee; // 拿到AudioBuffer结构体 + // console.log("音频数据字节数:", audioBuffer.mDataByteSize); // 比如4096(2048帧×2字节) + // console.log("声道数:", audioBuffer.mNumberChannels); // 1 + // console.log("二进制数据指针:", audioBuffer.mData); // 指向16位PCM数据的内存地址 + + // const int16Ptr = buffer.int16ChannelData; + // if (int16Ptr != null && frameLen > 0) { + // const dataPtr = int16Ptr![0]; + // const CHUNK_FRAME_SIZE = frameLen / 2; // 16位=2字节/帧 → 512帧/分片 + // // 关键2:循环拆分 9600 字节为多个小分片 + // for (let startFrame:number = 0; startFrame < frameLen; startFrame += CHUNK_FRAME_SIZE) { + // // 计算当前分片的结束帧(避免越界) + // const endFrame = Math.min(startFrame + CHUNK_FRAME_SIZE, frameLen); + // let _recordedPCMData: UInt8[] = []; + // // 只处理当前分片的帧 + // for (let i: Int = startFrame as Int; i < endFrame; i++) { + // const int16Value = dataPtr[i]; + // let byte1 = UInt8(int16Value & 0xFF); + // let byte2 = UInt8((int16Value >> 8) & 0xFF); + // _recordedPCMData.push(byte1); + // _recordedPCMData.push(byte2); + // } + // options.onFrame?.(_recordedPCMData); + // } + // } } - inputNode = audioEngine!.inputNode; - if (inputNode === null) { // 解包:先判断是否为nil - throw new Error("音频输入节点为空,无法获取音频格式"); - } - const unwrappedInputNode = inputNode!; - const inputFormat = unwrappedInputNode.inputFormat(forBus= 0); - unwrappedInputNode.installTap( - onBus= 0, // 总线编号,通常传 0 - bufferSize= 1024, // 缓冲区大小,常用 1024/2048 - format= inputFormat, // 音频格式 - block=(buffer: AVAudioPCMBuffer, time: any) => { - const floatData = buffer.floatChannelData; - const channelData = floatData![0]; - const frameLength = buffer.frameLength as number; - const bytesPerSample = 2; // 16位整型=2字节/样本 - const totalBytes = frameLength * bytesPerSample; - - console.log(channelData); - console.log(totalBytes); - const pcmData = NSMutableData.dataWithCapacity(20); // 可变Data,支持写入 - - // const data = new Float32Array(int32Array.byteLength); - // data.set(int32Array.buffer, 1); // 内存块拷贝,替代逐字节写入 - - options.onFrame?.(pcmData); - // if (floatData !== null) { - // // 单声道取第0个通道(立体声可取[0]左声道、[1]右声道) - // const channelData = floatData[0]; - - // options.onFrame?.(channelData) - // } - } - ); - UTSiOS.try(audioEngine!.start()); - if (audioEngine!.isRunning) { - console.log("引擎确实处于运行状态"); - isRecording = true; - } else { - console.error("调用 start() 但引擎未运行"); - } - isRecording = true; - } catch (error) { - isRecording = false; - } - } else { - // 权限被拒绝:回调错误 - isRecording = false; - } + ); + UTSiOS.try(audioEngine!.start()); + if (audioEngine!.isRunning) { + console.log("引擎确实处于运行状态"); + isRecording = true; + } else { + console.error("调用 start() 但引擎未运行"); + } + isRecording = true; + } catch (error) { + isRecording = false; + } + } }); - isRecording = true; + } catch (error) { + console.log('报错了', error); // 初始化失败回调错误 const err = new StartAudioRecordFailImpl(9010002); options.onError?.(err); @@ -117,6 +225,7 @@ export function startAudioRecord(options: StartAudioRecordOptions): void { */ export function stopAudioRecord(): void { + console.log('停止音频采集'); if (audioEngine === null) { // 解包:先判断是否为nil isRecording = false; return; // 直接返回,不执行后续逻辑 @@ -131,7 +240,7 @@ export function stopAudioRecord(): void { } const _inputNode = inputNode! _inputNode.removeTap(onBus= 0); // 移除音频回调 - + console.log('移除音频回调'); // 停用音频会话 const audioSession = AVAudioSession.sharedInstance(); @@ -141,8 +250,62 @@ export function stopAudioRecord(): void { }catch (e) { console.log(e) } + // console.log('数组大小',recordedPCMData.length); + // const filePath = savePCMToFile(recordedPCMData, sampleRate, channels); + // console.log('filePath', filePath); inputNode = null; audioEngine = null; // 释放全局引擎 isRecording = false; -} \ No newline at end of file +} + +/** + * 将Int16 PCM数组保存为文件(iOS沙盒路径) + * @param pcmData Int16格式的PCM数据 + * @param sampleRate 采样率 + * @param channels 声道数 + * @returns 文件路径 | null + */ +function savePCMToFile(pcmData: UInt8[], sampleRate: number, channels: number): string | null { + try { + const dataPath = UTSiOS.getDataPath(); + console.log('dataPath', dataPath); + if (dataPath === null) { + throw new Error("获取应用数据路径失败"); + } + // 2. 生成唯一文件名(避免覆盖) + const timestamp = new Date().getTime().toString(); + const filePath = dataPath + "/" + "recording_" + timestamp + ".pcm"; + const fileURL = NSURL.fileURL(withPath= filePath); + console.log(fileURL); + + // 3. 将Int16数组转为NSData(字节数据) + const byteCount = pcmData.length * 2; // 每个Int16占2字节 + const byteArray = Uint8Array.from(recordedPCMData); + const dataOptional = NSMutableData(length= byteArray.length); + // const dataOptional = NSMutableData(length= byteCount); + if (dataOptional === null) throw new Error("创建NSMutableData失败"); + const data = dataOptional!; + + for (let j:Int = 0; j < recordedPCMData.length; j++) { + // 获取当前字节值(UInt8) + const byteValue = recordedPCMData[j]; + // 将单个字节写入 NSMutableData 的指定位置 + data.replaceBytes(in = NSMakeRange(j, 1), withBytes= UTSiOS.getPointer(byteValue), length= 1); + } + + + // 4. 写入文件(UTS兼容的Swift风格) + const writeSuccess = data.write(toFile=filePath, atomically= true); + // console.log(data); + if (writeSuccess) { + console.log("PCM文件保存成功:", filePath); + return filePath; + } else { + throw new Error("文件写入失败"); + } + } catch (error) { + console.error("保存PCM文件出错:", error); + return null; + } +} diff --git a/src/uni_modules/ty-recording/utssdk/interface.uts b/src/uni_modules/ty-recording/utssdk/interface.uts index e95f00cf..c6c92c8b 100644 --- a/src/uni_modules/ty-recording/utssdk/interface.uts +++ b/src/uni_modules/ty-recording/utssdk/interface.uts @@ -8,7 +8,6 @@ export type AudioStartRes = { recordId ?: string; // 录音唯一标识(方便多录音实例管理) sampleRate ?: number; // 采样率(如16000) - format ?: string; // 录音格式(如pcm/mp3) startTime : number; // 开启时间戳(毫秒) }; @@ -51,7 +50,7 @@ export type StartAudioRecordOptions = { onVolume ?: (volume : number) => void; // 实时音量回调(如每秒5次,按设备采集频率) // 【一次性状态回调】- 特定节点仅触发一次 - onStart ?: (res : AudioStartRes) => void; // 成功开启录音的回调(仅触发1次) + onStart ?: (res: AudioStartRes) => void; // 成功开启录音的回调(仅触发1次) onError ?: (res : AudioErrorRes) => void; // 录音错误回调(任意阶段出错都触发,仅1次) onStop ?: () => void; // 录音结束的纯状态回调(仅通知结束,无返回,1次) onFile ?: (res : AudioFileRes) => void; // 录音结束后,返回录音文件的回调(1次,核心)