fix:增加收到TalkData之后的处理方法

This commit is contained in:
liyi 2024-12-24 14:21:49 +08:00
parent 4ab5d77473
commit d642d79aa1
6 changed files with 117 additions and 35 deletions

View File

@ -1,5 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_pcm_sound/flutter_pcm_sound.dart';
import 'package:flutter_voice_processor/flutter_voice_processor.dart'; import 'package:flutter_voice_processor/flutter_voice_processor.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
@ -7,6 +9,8 @@ import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/blue/io_tool/manager_event_bus.dart'; import 'package:star_lock/blue/io_tool/manager_event_bus.dart';
import 'package:star_lock/main/lockDetail/monitoring/star_chart_h264/star_chart_state.dart'; import 'package:star_lock/main/lockDetail/monitoring/star_chart_h264/star_chart_state.dart';
import 'package:star_lock/talk/startChart/events/talk_status_change_event.dart'; import 'package:star_lock/talk/startChart/events/talk_status_change_event.dart';
import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.dart';
import 'package:star_lock/talk/startChart/proto/talk_data.pbenum.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart'; import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart'; import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
@ -21,7 +25,14 @@ class StarChartLogic extends BaseGetXController {
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
// 44100 Hz
FlutterPcmSound.setup(sampleRate: 44100, channelCount: 1, );
// 使
int feedThreshold = 44100 * 1; // 44100
FlutterPcmSound.setFeedThreshold(feedThreshold);
_getTalkStatusRefreshUIAction(); _getTalkStatusRefreshUIAction();
_startListenTalkData();
} }
void _getTalkStatusRefreshUIAction() { void _getTalkStatusRefreshUIAction() {
@ -36,8 +47,11 @@ class StarChartLogic extends BaseGetXController {
state.talkStatus.value == TalkStatus.notTalkPing.index || state.talkStatus.value == TalkStatus.notTalkPing.index ||
state.talkStatus.value == TalkStatus.end.index) { state.talkStatus.value == TalkStatus.end.index) {
_cancelTimers(); _cancelTimers();
stopProcessing();
state.listPhotoData.value = Uint8List(0);
// //
Get.back(); Get.back();
return; return;
} }
@ -47,6 +61,33 @@ class StarChartLogic extends BaseGetXController {
}); });
} }
//
void _startListenTalkData() {
state.talkDataRepository.talkDataStream.listen((talkData) {
final contentType = talkData.contentType;
//
switch (contentType) {
case TalkData_ContentTypeE.G711:
_playG711Data(talkData.content);
break;
}
});
}
///
Future<void> _playG711Data(List<int> audioData) async {
final PcmArrayInt16 fromList = PcmArrayInt16.fromList(audioData);
await FlutterPcmSound.feed(fromList);
FlutterPcmSound.play();
}
void _stopPlayG711Data() {
FlutterPcmSound.pause();
FlutterPcmSound.clear();
FlutterPcmSound.stop();
}
void _startCallTimer() { void _startCallTimer() {
state.oneMinuteTimeTimer.cancel(); state.oneMinuteTimeTimer.cancel();
state.oneMinuteTimeTimer = state.oneMinuteTimeTimer =

View File

@ -15,6 +15,7 @@ import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/main/lockDetail/monitoring/star_chart_h264/star_chart_logic.dart'; import 'package:star_lock/main/lockDetail/monitoring/star_chart_h264/star_chart_logic.dart';
import 'package:star_lock/main/lockDetail/monitoring/star_chart_h264/star_chart_state.dart'; import 'package:star_lock/main/lockDetail/monitoring/star_chart_h264/star_chart_state.dart';
import 'package:star_lock/talk/startChart/proto/talk_data.pbenum.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart'; import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
import 'package:star_lock/talk/startChart/webView/h264_web_view.dart'; import 'package:star_lock/talk/startChart/webView/h264_web_view.dart';
import 'package:star_lock/talk/udp/udp_manage.dart'; import 'package:star_lock/talk/udp/udp_manage.dart';
@ -265,19 +266,48 @@ class _StarChartPageState extends State<StarChartPage> {
} }
void _getTVDataRefreshUIAction() { void _getTVDataRefreshUIAction() {
state.getTVDataRefreshUIEvent = eventBus // state.getTVDataRefreshUIEvent = eventBus
.on<GetTVDataRefreshUI>() // .on<GetTVDataRefreshUI>()
.listen((GetTVDataRefreshUI event) async { // .listen((GetTVDataRefreshUI event) async {
if (event.tvList.isNotEmpty && event.tvList.length > 100) { // if (event.tvList.isNotEmpty && event.tvList.length > 100) {
final Uint8List imageData = Uint8List.fromList(event.tvList); // final Uint8List imageData = Uint8List.fromList(event.tvList);
if (!listEquals(state.listPhotoData.value, imageData)) { // if (!listEquals(state.listPhotoData.value, imageData)) {
state.listPhotoData.value = imageData; // state.listPhotoData.value = imageData;
state.shouldUpdateUI.value = true; // state.shouldUpdateUI.value = true;
if (state.shouldUpdateUI.value) { // if (state.shouldUpdateUI.value) {
setState(() {}); // setState(() {});
state.shouldUpdateUI.value = false; // 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;
// trueUI
state.shouldUpdateUI.value = true;
// WidgetsBinding.instance.addPostFrameCallback((_) {
// setState方法之前检查标志true时才更新UI
if (state.shouldUpdateUI.value) {
setState(() {
// UI
});
// UI后将标志重新设置为false
state.shouldUpdateUI.value = false;
}
// });
}
} }
} break;
} }
}); });
} }

View File

@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_voice_processor/flutter_voice_processor.dart'; import 'package:flutter_voice_processor/flutter_voice_processor.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:network_info_plus/network_info_plus.dart'; import 'package:network_info_plus/network_info_plus.dart';
import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart'; import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
import '../../../../tools/storage.dart'; import '../../../../tools/storage.dart';
@ -54,4 +55,8 @@ class StarChartState {
RxInt openDoorSeconds = 0.obs; RxInt openDoorSeconds = 0.obs;
RxInt talkStatus = 0.obs; // RxInt talkStatus = 0.obs; //
//
final TalkDataRepository talkDataRepository = TalkDataRepository.instance;
} }

View File

@ -31,8 +31,8 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
// //
final GenericResp genericResp = scpMessage.Payload; final GenericResp genericResp = scpMessage.Payload;
if (checkGenericRespSuccess(genericResp)) { if (checkGenericRespSuccess(genericResp)) {
// 2 //
Future.delayed(Duration(seconds: 5), () { Future.delayed(Duration(seconds: 1), () {
// //
_handleStartTalkPing(); _handleStartTalkPing();
// //
@ -57,13 +57,13 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
@override @override
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required Uint8List byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,
int? spIndex, int? spIndex,
int? messageId}) { int? messageId}) {
if (messageType == MessageTypeConstant.Resp) { if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp(); final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte); genericResp.mergeFromBuffer(byte);
@ -114,6 +114,4 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
// //
startChartManage.startTalkExpectTimer(); startChartManage.startTalkExpectTimer();
} }
} }

View File

@ -3,6 +3,7 @@ import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/talk/call/g711.dart';
import 'package:star_lock/talk/startChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/message_type_constant.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart'; import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart';
@ -25,13 +26,12 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {
//
talkDataOverTimeTimerManager.receiveMessage();
if (scpMessage.Payload != null) { if (scpMessage.Payload != null) {
final TalkData talkData = scpMessage.Payload; final TalkData talkData = scpMessage.Payload;
// //
_handleTalkData(talkData: talkData); _handleTalkData(talkData: talkData);
print('talkData$talkData');
//
talkDataOverTimeTimerManager.receiveMessage();
} }
} }
@ -64,7 +64,15 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
/// g711音频数据 /// g711音频数据
void _handleVideoG711(TalkData talkData) { void _handleVideoG711(TalkData talkData) {
talkDataRepository.addTalkData(talkData); try {
final g711Data = talkData.content;
// pcm数据
List<int> pcmBytes = G711().convertList(g711Data);
talkData.content = pcmBytes;
talkDataRepository.addTalkData(talkData);
} catch (e) {
print('Error decoding G.711 to PCM: $e');
}
} }
@override @override

View File

@ -126,7 +126,6 @@ class StartChartManage {
FromPeerId = requestStarChartRegisterNode.peer!.id ?? ''; FromPeerId = requestStarChartRegisterNode.peer!.id ?? '';
bindUserStarchart(); bindUserStarchart();
} }
} }
// //
@ -158,7 +157,6 @@ class StartChartManage {
if (relayInfoEntity.client_addr != null) { if (relayInfoEntity.client_addr != null) {
localPublicHost = relayInfoEntity.client_addr!; localPublicHost = relayInfoEntity.client_addr!;
} }
if (relayInfoEntity.relay_list != null && if (relayInfoEntity.relay_list != null &&
relayInfoEntity.relay_list!.length > 0) { relayInfoEntity.relay_list!.length > 0) {
for (int i = 0; i <= relayInfoEntity.relay_list!.length; i++) { for (int i = 0; i <= relayInfoEntity.relay_list!.length; i++) {
@ -220,7 +218,6 @@ class StartChartManage {
// 线 // 线
Future<void> _sendOnlineMessage() async { Future<void> _sendOnlineMessage() async {
_log(text: '发送上线消息,是否已经上线:$isOnlineStartChartServer');
if (isOnlineStartChartServer) { if (isOnlineStartChartServer) {
_log(text: '星图已上线,请勿重复发送上线消息'); _log(text: '星图已上线,请勿重复发送上线消息');
return; return;
@ -285,8 +282,8 @@ class StartChartManage {
} }
// //
void sendEchoMessage({required List<int> payload,required String toPeerId}) async { void sendEchoMessage(
{required List<int> payload, required String toPeerId}) async {
// //
final int totalPackets = (payload.length / _maxPayloadSize).ceil(); final int totalPackets = (payload.length / _maxPayloadSize).ceil();
// //
@ -763,7 +760,10 @@ class StartChartManage {
_handleUdpResultData(deserialize); _handleUdpResultData(deserialize);
} }
if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) { if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) {
// _log(text: 'Udp收到结构体数据---》$deserialize'); if (deserialize.Payload != null) {
_log(text: 'Udp收到结构体数据---》$deserialize');
}
// _log(text: 'text---》${utf8.decode(deserialize.Payload)}'); // _log(text: 'text---》${utf8.decode(deserialize.Payload)}');
} }
} }
@ -791,8 +791,8 @@ class StartChartManage {
} else { } else {
handler.handleInvalidReq(scpMessage); handler.handleInvalidReq(scpMessage);
} }
} catch (e) { } catch (e, stackTrace) {
// _log(text: '❌ 处理udp返回数据时遇到错误---> $e'); _log(text: '❌ 处理udp返回数据时遇到错误---> $e\n,$stackTrace');
} }
} }