import 'dart:convert'; 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'; import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart'; import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart'; import 'package:star_lock/talk/startChart/proto/generic.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_data.pbserver.dart'; class UdpTalkDataHandler extends ScpMessageBaseHandle implements ScpMessageHandler { @override void handleReq(ScpMessage scpMessage) {} @override void handleResp(ScpMessage scpMessage) {} @override void handleInvalidReq(ScpMessage scpMessage) {} @override void handleRealTimeData(ScpMessage scpMessage) { // 收到数据后调用更新,防止定时器超时 talkDataOverTimeTimerManager.receiveMessage(); if (scpMessage.Payload != null) { final TalkData talkData = scpMessage.Payload; // 处理音视频数据 _handleTalkData(talkData: talkData); } } void _handleTalkData({required TalkData talkData}) { if (talkData == null) return; final contentType = talkData.contentType; switch (contentType) { case TalkData_ContentTypeE.H264: _handleVideoH264(talkData); break; case TalkData_ContentTypeE.Image: _handleVideoImage(talkData); break; case TalkData_ContentTypeE.G711: _handleVideoG711(talkData); break; default: print('❌未知的TalkData--->contentType类型'); break; } } /// 处理h264协议的数据 void _handleVideoH264(TalkData talkData) { // talkDataRepository.addTalkData(talkData); } /// 处理图片数据 void _handleVideoImage(TalkData talkData) {} /// 处理g711音频数据 void _handleVideoG711(TalkData talkData) { try { final g711Data = talkData.content; // 转pcm数据 List pcmBytes = G711().convertList(g711Data); talkData.content = pcmBytes; talkDataRepository.addTalkData(talkData); } catch (e) { print('Error decoding G.711 to PCM: $e'); } } @override deserializePayload( {required int payloadType, required int messageType, required Uint8List byte, int? offset, int? PayloadLength, int? spTotal, int? spIndex, int? messageId}) { if (messageType == MessageTypeConstant.RealTimeData) { // 回声测试 if (spTotal != null && spTotal > 1 && messageId != null && spIndex != null) { // 分包处理 return handleFragmentedPayload( messageId: messageId, spTotal: spTotal, spIndex: spIndex, byte: byte, payloadType: payloadType, ); } else { // 没有分包直接解析 final TalkData talkData = TalkData(); talkData.mergeFromBuffer(byte); return talkData; } } } }