From cdbd0c3d036a1eed501813d1c3fde1695807f7c9 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 25 Dec 2024 09:41:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E8=A1=A5=E5=85=85=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../star_chart_h264/star_chart_logic.dart | 19 ++++ .../star_chart_h264/star_chart_page.dart | 94 +++++++++---------- .../handle/impl/udp_talk_data_handler.dart | 9 ++ .../handle/scp_message_base_handle.dart | 11 ++- lib/talk/startChart/start_chart_manage.dart | 26 ++++- 5 files changed, 105 insertions(+), 54 deletions(-) diff --git a/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_logic.dart b/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_logic.dart index f9884a7d..88e37fea 100644 --- a/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_logic.dart +++ b/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_logic.dart @@ -22,6 +22,9 @@ class StarChartLogic extends BaseGetXController { /// 收到Talk发送的状态 StreamSubscription? _getTalkStatusRefreshUIEvent; + int startTime = DateTime.now().millisecondsSinceEpoch; + + @override void onReady() { super.onReady(); @@ -73,6 +76,22 @@ class StarChartLogic extends BaseGetXController { }); } + void syncPlay() { + int currentTime = DateTime.now().millisecondsSinceEpoch - startTime; + + // 播放音频 + // while (audioBuffer.isNotEmpty && audioBuffer.first.durationMs <= currentTime) { + // TalkData audioData = audioBuffer.removeAt(0); + // playAudio(audioData.content); + // } + // + // // 播放视频 + // while (videoBuffer.isNotEmpty && videoBuffer.first.durationMs <= currentTime) { + // TalkData videoData = videoBuffer.removeAt(0); + // playVideo(videoData.content); + // } + } + /// 播放音频数据 Future _playG711Data(List pcmData) async { // 将 PCM 数据转换为 PcmArrayInt16 diff --git a/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_page.dart b/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_page.dart index f8669c97..a7854c0c 100644 --- a/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_page.dart +++ b/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_page.dart @@ -38,7 +38,7 @@ class _StarChartPageState extends State { super.initState(); initAsync(); - _getTVDataRefreshUIAction(); + // _getTVDataRefreshUIAction(); } Future initAsync() async { @@ -265,52 +265,52 @@ class _StarChartPageState extends State { } } - void _getTVDataRefreshUIAction() { - // state.getTVDataRefreshUIEvent = eventBus - // .on() - // .listen((GetTVDataRefreshUI event) async { - // if (event.tvList.isNotEmpty && event.tvList.length > 100) { - // final Uint8List imageData = Uint8List.fromList(event.tvList); - // if (!listEquals(state.listPhotoData.value, imageData)) { - // state.listPhotoData.value = imageData; - // state.shouldUpdateUI.value = true; - // if (state.shouldUpdateUI.value) { - // setState(() {}); - // state.shouldUpdateUI.value = false; - // } - // } - // } - // }); - state.talkDataRepository.talkDataStream.listen((talkData) { - final contentType = talkData.contentType; - // 判断数据类型,进行分发处理 - switch (contentType) { - case TalkData_ContentTypeE.Image: - state.listPhotoData.value = Uint8List.fromList(talkData.content); - if (talkData.content.isNotEmpty && talkData.content.length > 100) { - // 比较新旧数据是否相同 - final Uint8List imageData = Uint8List.fromList(talkData.content); - if (!listEquals(state.listPhotoData.value, imageData)) { - // 更新状态 - state.listPhotoData.value = imageData; - // 设置标志为true,表示需要更新UI - state.shouldUpdateUI.value = true; - // WidgetsBinding.instance.addPostFrameCallback((_) { - // 调用setState方法之前检查标志,只有当标志为true时才更新UI - if (state.shouldUpdateUI.value) { - setState(() { - // 更新UI - }); - // 更新完UI后将标志重新设置为false - state.shouldUpdateUI.value = false; - } - // }); - } - } - break; - } - }); - } + // void _getTVDataRefreshUIAction() { + // // state.getTVDataRefreshUIEvent = eventBus + // // .on() + // // .listen((GetTVDataRefreshUI event) async { + // // if (event.tvList.isNotEmpty && event.tvList.length > 100) { + // // final Uint8List imageData = Uint8List.fromList(event.tvList); + // // if (!listEquals(state.listPhotoData.value, imageData)) { + // // state.listPhotoData.value = imageData; + // // state.shouldUpdateUI.value = true; + // // if (state.shouldUpdateUI.value) { + // // setState(() {}); + // // state.shouldUpdateUI.value = false; + // // } + // // } + // // } + // // }); + // state.talkDataRepository.talkDataStream.listen((talkData) { + // final contentType = talkData.contentType; + // // 判断数据类型,进行分发处理 + // switch (contentType) { + // case TalkData_ContentTypeE.Image: + // state.listPhotoData.value = Uint8List.fromList(talkData.content); + // if (talkData.content.isNotEmpty && talkData.content.length > 100) { + // // 比较新旧数据是否相同 + // final Uint8List imageData = Uint8List.fromList(talkData.content); + // if (!listEquals(state.listPhotoData.value, imageData)) { + // // 更新状态 + // state.listPhotoData.value = imageData; + // // 设置标志为true,表示需要更新UI + // state.shouldUpdateUI.value = true; + // // WidgetsBinding.instance.addPostFrameCallback((_) { + // // 调用setState方法之前检查标志,只有当标志为true时才更新UI + // if (state.shouldUpdateUI.value) { + // setState(() { + // // 更新UI + // }); + // // 更新完UI后将标志重新设置为false + // state.shouldUpdateUI.value = false; + // } + // // }); + // } + // } + // break; + // } + // }); + // } @override void dispose() { diff --git a/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart b/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart index 856b84ce..20d6d1f0 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart @@ -30,11 +30,20 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle talkDataOverTimeTimerManager.receiveMessage(); if (scpMessage.Payload != null) { final TalkData talkData = scpMessage.Payload; + print('talkData: ${listToHexString(talkData.content)}'); + // 处理音视频数据 _handleTalkData(talkData: talkData); } } + String listToHexString(List intList) { + // 将整数列表转换为十六进制字符串列表 + List hexList = intList.map((num) => num.toRadixString(16)).toList(); + // 将十六进制字符串列表连接成一个字符串,没有空格 + return hexList.join(''); + } + void _handleTalkData({required TalkData talkData}) { if (talkData == null) return; final contentType = talkData.contentType; diff --git a/lib/talk/startChart/handle/scp_message_base_handle.dart b/lib/talk/startChart/handle/scp_message_base_handle.dart index 1d13809e..a54fb927 100644 --- a/lib/talk/startChart/handle/scp_message_base_handle.dart +++ b/lib/talk/startChart/handle/scp_message_base_handle.dart @@ -115,12 +115,13 @@ class ScpMessageBaseHandle { final TalkData talkData = TalkData(); talkData.mergeFromBuffer(completePayload); return talkData; - } else if (payloadType == PayloadTypeConstant.echoTest) { - return completePayload; - } else { - String payload = utf8.decode(completePayload); - return payload; } + // if (payloadType == PayloadTypeConstant.echoTest) { + // return completePayload; + // } else { + // String payload = utf8.decode(completePayload); + // return payload; + // } } else { // 如果分包尚未接收完全,返回 null 或其他指示符 return null; diff --git a/lib/talk/startChart/start_chart_manage.dart b/lib/talk/startChart/start_chart_manage.dart index 22ff1c64..d146a42a 100644 --- a/lib/talk/startChart/start_chart_manage.dart +++ b/lib/talk/startChart/start_chart_manage.dart @@ -330,6 +330,14 @@ class StartChartManage { // 发送同意接听消息 void sendTalkAcceptMessage() async { + if (talkStatus.status == TalkStatus.duringCall) { + _log(text: '已经在通话中,请勿重复发送同意接听消息'); + return; + } + if (talkStatus.status != TalkStatus.waitingAnswer) { + _log(text: '当前未处于等待接听状态, 无法发送同意接听消息'); + return; + } final message = MessageCommand.talkAcceptMessage( ToPeerId: ToPeerId, FromPeerId: FromPeerId, @@ -341,6 +349,10 @@ class StartChartManage { // 发送拒绝接听消息 void sendTalkRejectMessage() async { + if (talkStatus.status != TalkStatus.waitingAnswer) { + _log(text: '当前未处于等待接听状态, 无法发送拒绝接听消息'); + return; + } final message = MessageCommand.talkRejectMessage( ToPeerId: ToPeerId, FromPeerId: FromPeerId, @@ -351,6 +363,10 @@ class StartChartManage { // 发送期望接受消息 void sendTalkExpectMessage({required TalkExpect talkExpect}) async { + if (talkStatus.status != TalkStatus.duringCall) { + _log(text: '当前未处于接听状态, 无法发送期望接受数据消息'); + return; + } final message = MessageCommand.talkExpectMessage( ToPeerId: ToPeerId, FromPeerId: FromPeerId, @@ -391,6 +407,10 @@ class StartChartManage { // 发送通话保持消息 Future sendTalkPingMessage( {required String ToPeerId, required String FromPeerId}) async { + if (talkStatus.status != TalkStatus.duringCall) { + _log(text: '当前未处于接听状态, 无法发送通话保持消息'); + return; + } final message = MessageCommand.talkPingMessage( ToPeerId: ToPeerId, FromPeerId: FromPeerId, @@ -401,6 +421,10 @@ class StartChartManage { // 发送通话中挂断消息 Future sendTalkHangupMessage() async { + if (talkStatus.status != TalkStatus.duringCall) { + _log(text: '当前未处于接听状态, 无法发送通话中挂断消息'); + return; + } final message = MessageCommand.talkHangupMessage( ToPeerId: ToPeerId, FromPeerId: FromPeerId, @@ -475,7 +499,6 @@ class StartChartManage { StarChartRegisterNodeEntity starChartRegisterNodeEntity) async { if (starChartRegisterNodeEntity != null) { await Storage.saveStarChartRegisterNodeInfo(starChartRegisterNodeEntity); - _log(text: '注册成功'); } } @@ -764,7 +787,6 @@ class StartChartManage { if (deserialize.Payload != null) { _log(text: 'Udp收到结构体数据---》$deserialize'); } - // _log(text: 'text---》${utf8.decode(deserialize.Payload)}'); } }