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 'package:flutter/foundation.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:get/get.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/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/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_talk_status.dart';
import 'package:star_lock/tools/baseGetXController.dart';
@ -21,7 +25,14 @@ class StarChartLogic extends BaseGetXController {
@override
void onReady() {
super.onReady();
// 44100 Hz
FlutterPcmSound.setup(sampleRate: 44100, channelCount: 1, );
// 使
int feedThreshold = 44100 * 1; // 44100
FlutterPcmSound.setFeedThreshold(feedThreshold);
_getTalkStatusRefreshUIAction();
_startListenTalkData();
}
void _getTalkStatusRefreshUIAction() {
@ -36,8 +47,11 @@ class StarChartLogic extends BaseGetXController {
state.talkStatus.value == TalkStatus.notTalkPing.index ||
state.talkStatus.value == TalkStatus.end.index) {
_cancelTimers();
stopProcessing();
state.listPhotoData.value = Uint8List(0);
//
Get.back();
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() {
state.oneMinuteTimeTimer.cancel();
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/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/talk/startChart/proto/talk_data.pbenum.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/udp/udp_manage.dart';
@ -265,19 +266,48 @@ class _StarChartPageState extends State<StarChartPage> {
}
void _getTVDataRefreshUIAction() {
state.getTVDataRefreshUIEvent = eventBus
.on<GetTVDataRefreshUI>()
.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.getTVDataRefreshUIEvent = eventBus
// .on<GetTVDataRefreshUI>()
// .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;
// 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:get/get.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 '../../../../tools/storage.dart';
@ -54,4 +55,8 @@ class StarChartState {
RxInt openDoorSeconds = 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;
if (checkGenericRespSuccess(genericResp)) {
// 2
Future.delayed(Duration(seconds: 5), () {
//
Future.delayed(Duration(seconds: 1), () {
//
_handleStartTalkPing();
//
@ -57,13 +57,13 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
@ -114,6 +114,4 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
//
startChartManage.startTalkExpectTimer();
}
}

View File

@ -3,6 +3,7 @@ import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.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/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart';
@ -25,13 +26,12 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
@override
void handleRealTimeData(ScpMessage scpMessage) {
//
talkDataOverTimeTimerManager.receiveMessage();
if (scpMessage.Payload != null) {
final TalkData talkData = scpMessage.Payload;
//
_handleTalkData(talkData: talkData);
print('talkData$talkData');
//
talkDataOverTimeTimerManager.receiveMessage();
}
}
@ -64,7 +64,15 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
/// g711音频数据
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

View File

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