From cafe132afc0005d2eca5643f83c0c86a7c478e2e Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 28 Aug 2025 13:41:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=BD=95=E9=9F=B3?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E6=92=AD=E6=94=BE=E5=A3=B0=E9=9F=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../image_transmission_logic.dart | 30 +++++----------- .../native/talk_view_native_decode_logic.dart | 7 ++-- .../views/talkView/talk_view_logic.dart | 34 ++++++------------- 3 files changed, 25 insertions(+), 46 deletions(-) diff --git a/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart b/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart index 0bf874fd..e4500bc2 100644 --- a/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart +++ b/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart @@ -110,22 +110,8 @@ class ImageTransmissionLogic extends BaseGetXController { // 判断数据类型,进行分发处理 switch (contentType) { case TalkData_ContentTypeE.G711: - // // 第一帧到达时记录开始时间 - if (_isFirstAudioFrame) { - _startAudioTime = currentTime; - _isFirstAudioFrame = false; - } - - // 计算音频延迟 - final expectedTime = _startAudioTime + talkData.durationMs; - final audioDelay = currentTime - expectedTime; - - // 如果延迟太大,清空缓冲区并直接播放 - if (audioDelay > 500) { - state.audioBuffer.clear(); - if (state.isOpenVoice.value) { - _playAudioFrames(); - } + // 没有开启所有和录音时不缓存和播放音频 + if (!state.isOpenVoice.value && state.isRecordingAudio.value) { return; } if (state.audioBuffer.length >= audioBufferSize) { @@ -212,7 +198,8 @@ class ImageTransmissionLogic extends BaseGetXController { /// 播放音频数据 void _playAudioData(TalkData talkData) async { - if (state.isOpenVoice.value) { + if (state.isOpenVoice.value && + state.isRecordingAudio.value == false) { final list = G711().decodeAndDenoise(talkData.content, true, 8000, 300, 150); // // 将 PCM 数据转换为 PcmArrayInt16 @@ -565,7 +552,6 @@ class ImageTransmissionLogic extends BaseGetXController { //开始录音 Future startProcessingAudio() async { - try { if (await state.voiceProcessor?.hasRecordAudioPermission() ?? false) { await state.voiceProcessor?.start(state.frameLength, state.sampleRate); @@ -656,12 +642,14 @@ class ImageTransmissionLogic extends BaseGetXController { List encodedData = G711Tool.encode(applyGain, 0); // 0表示A-law _bufferedAudioFrames.addAll(encodedData); - // 启动定时发送器(仅启动一次) - if (_startProcessingAudioTimer == null && _bufferedAudioFrames.length > chunkSize) { - _startProcessingAudioTimer = Timer.periodic(Duration(milliseconds: intervalMs), _sendAudioChunk); + if (_startProcessingAudioTimer == null && + _bufferedAudioFrames.length > chunkSize) { + _startProcessingAudioTimer = + Timer.periodic(Duration(milliseconds: intervalMs), _sendAudioChunk); } } + // 错误监听 void _onError(VoiceProcessorException error) { AppLog.log(error.message!); diff --git a/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart b/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart index 50eda207..65d270c4 100644 --- a/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart +++ b/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart @@ -493,7 +493,9 @@ class TalkViewNativeDecodeLogic extends BaseGetXController { /// 播放音频数据 void _playAudioData(TalkData talkData) async { - if (state.isOpenVoice.value && state.isLoading.isFalse) { + if (state.isOpenVoice.value && + state.isLoading.isFalse && + state.isRecordingAudio.value == false) { List encodedData = G711Tool.decode(talkData.content, 0); // 0表示A-law // 将 PCM 数据转换为 PcmArrayInt16 final PcmArrayInt16 fromList = PcmArrayInt16.fromList(encodedData); @@ -970,7 +972,8 @@ class TalkViewNativeDecodeLogic extends BaseGetXController { // 判断数据类型,进行分发处理 switch (contentType) { case TalkData_ContentTypeE.G711: - if (!state.isOpenVoice.value) { + // 没有开启所有和录音时不缓存和播放音频 + if (!state.isOpenVoice.value && state.isRecordingAudio.value) { return; } if (state.audioBuffer.length >= audioBufferSize) { diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index c46db104..6a360471 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -109,22 +109,8 @@ class TalkViewLogic extends BaseGetXController { // 判断数据类型,进行分发处理 switch (contentType) { case TalkData_ContentTypeE.G711: - // // 第一帧到达时记录开始时间 - if (_isFirstAudioFrame) { - _startAudioTime = currentTime; - _isFirstAudioFrame = false; - } - - // 计算音频延迟 - final expectedTime = _startAudioTime + talkData.durationMs; - final audioDelay = currentTime - expectedTime; - - // 如果延迟太大,清空缓冲区并直接播放 - if (audioDelay > 500) { - state.audioBuffer.clear(); - if (state.isOpenVoice.value) { - _playAudioFrames(); - } + // 没有开启所有和录音时不缓存和播放音频 + if (!state.isOpenVoice.value && state.isRecordingAudio.value) { return; } if (state.audioBuffer.length >= audioBufferSize) { @@ -388,9 +374,11 @@ class TalkViewLogic extends BaseGetXController { if (state.videoBuffer.isNotEmpty) { final TalkData oldestFrame = state.videoBuffer.removeAt(0); if (oldestFrame.content.isNotEmpty) { - state.listData.value = Uint8List.fromList(oldestFrame.content); // 备份原始数据 + state.listData.value = + Uint8List.fromList(oldestFrame.content); // 备份原始数据 final int decodeStart = DateTime.now().millisecondsSinceEpoch; - decodeImageFromList(Uint8List.fromList(oldestFrame.content)).then((ui.Image img) { + decodeImageFromList(Uint8List.fromList(oldestFrame.content)) + .then((ui.Image img) { final int decodeEnd = DateTime.now().millisecondsSinceEpoch; state.currentImage.value = img; _renderedFrameCount++; @@ -524,7 +512,7 @@ class TalkViewLogic extends BaseGetXController { final lockPeerId = StartChartManage().lockPeerId; final LockListInfoGroupEntity? lockListInfoGroupEntity = - await Storage.getLockMainListData(); + await Storage.getLockMainListData(); if (lockListInfoGroupEntity != null) { lockListInfoGroupEntity!.groupList?.forEach((element) { final lockList = element.lockList; @@ -562,7 +550,6 @@ class TalkViewLogic extends BaseGetXController { //开始录音 Future startProcessingAudio() async { - try { if (await state.voiceProcessor?.hasRecordAudioPermission() ?? false) { await state.voiceProcessor?.start(state.frameLength, state.sampleRate); @@ -653,10 +640,11 @@ class TalkViewLogic extends BaseGetXController { List encodedData = G711Tool.encode(applyGain, 0); // 0表示A-law _bufferedAudioFrames.addAll(encodedData); - // 启动定时发送器(仅启动一次) - if (_startProcessingAudioTimer == null && _bufferedAudioFrames.length > chunkSize) { - _startProcessingAudioTimer = Timer.periodic(Duration(milliseconds: intervalMs), _sendAudioChunk); + if (_startProcessingAudioTimer == null && + _bufferedAudioFrames.length > chunkSize) { + _startProcessingAudioTimer = + Timer.periodic(Duration(milliseconds: intervalMs), _sendAudioChunk); } }