fix:增加收到TalkData之后的处理方法
This commit is contained in:
parent
4ab5d77473
commit
d642d79aa1
@ -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 =
|
||||||
|
|||||||
@ -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;
|
||||||
|
// 设置标志为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;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user