fix:整理对讲状态、增加视频页面的旋转角度

This commit is contained in:
liyi 2025-01-02 10:28:56 +08:00
parent 4044b9b1e1
commit 87ed175fed
4 changed files with 49 additions and 66 deletions

View File

@ -12,11 +12,14 @@ 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_expect.pb.dart';
import 'package:star_lock/talk/startChart/views/talkView/talk_view_state.dart';
import '../../start_chart_manage.dart';
class UdpTalkExpectHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
final TalkViewState talkViewState = TalkViewState();
@override
void handleReq(ScpMessage scpMessage) {
//
@ -33,9 +36,12 @@ class UdpTalkExpectHandler extends ScpMessageBaseHandle
@override
void handleResp(ScpMessage scpMessage) {
//
final GenericResp genericResp = scpMessage.Payload;
if (checkGenericRespSuccess(genericResp)) {
final TalkExpectResp talkExpectResp = scpMessage.Payload;
if (talkExpectResp != null) {
print('收到预期音视频数据回复');
//
startChartManage.stopTalkExpectMessageTimer();
talkViewState.rotateAngle.value = talkExpectResp.rotate ?? 0;
}
}
@ -56,12 +62,12 @@ class UdpTalkExpectHandler extends ScpMessageBaseHandle
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
// final TalkExpectResp talkExpectResp = TalkExpectResp();
// talkExpectResp.mergeFromBuffer(byte);
// return talkExpectResp;
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
final TalkExpectResp talkExpectResp = TalkExpectResp();
talkExpectResp.mergeFromBuffer(byte);
return talkExpectResp;
// final GenericResp genericResp = GenericResp();
// genericResp.mergeFromBuffer(byte);
// return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkExpectReq talkExpect = TalkExpectReq();
talkExpect.mergeFromBuffer(byte);

View File

@ -32,11 +32,11 @@ class TalkViewLogic extends BaseGetXController {
Timer? _syncTimer; //
int _startTime = 0; //
final int bufferSize = 8; //
final int bufferSize = 20; //
final List<int> frameTimestamps = []; // FPS
int frameIntervalMs = 45; // 4522FPS
int minFrameIntervalMs = 30; // 33 FPS
int maxFrameIntervalMs = 500; // 2 FPS
int maxFrameIntervalMs = 500; // 1 FPS
// int maxFrameIntervalMs = 100; // 10 FPS
///
@ -54,7 +54,7 @@ class TalkViewLogic extends BaseGetXController {
///
void udpHangUpAction() async {
if (state.talkStatus.value == TalkStatus.duringCall) {
if (state.talkStatus.value == TalkStatus.answeredSuccessfully) {
//
StartChartManage().sendTalkHangupMessage();
} else {
@ -66,31 +66,13 @@ class TalkViewLogic extends BaseGetXController {
//
void initiateAnswerCommand() {
StartChartManage().sendTalkAcceptMessage();
}
void _updateFps(List<int> frameTimestamps) {
final int now = DateTime.now().millisecondsSinceEpoch;
// 1
frameTimestamps.removeWhere((timestamp) => now - timestamp > 1000);
// FPS
final double fps = frameTimestamps.length.toDouble();
// FPS
state.fps.value = fps;
StartChartManage().startTalkAcceptTimer();
}
//
void _startListenTalkData() {
state.talkDataRepository.talkDataStream.listen((TalkData talkData) {
final contentType = talkData.contentType;
final currentTimestamp = DateTime.now().millisecondsSinceEpoch;
///
if (state.startChartTalkStatus.status != TalkStatus.duringCall) {
return;
}
//
switch (contentType) {
@ -105,10 +87,10 @@ class TalkViewLogic extends BaseGetXController {
if (state.videoBuffer.length < bufferSize) {
state.videoBuffer.add(talkData);
}
print('talkData durationMs-->:${talkData.durationMs}');
// print('talkData durationMs-->:${talkData.durationMs}');
///
updateNetworkStatus(currentTimestamp);
// updateNetworkStatus(currentTimestamp);
break;
}
});
@ -187,10 +169,6 @@ class TalkViewLogic extends BaseGetXController {
if (state.videoBuffer.length > 1) {
state.videoBuffer.removeAt(0);
} else {
// //
// frameTimestamps.add(DateTime.now().millisecondsSinceEpoch);
// // FPS
// _updateFps(frameTimestamps);
_playVideoData(state.videoBuffer.removeAt(0));
}
}
@ -236,10 +214,6 @@ class TalkViewLogic extends BaseGetXController {
if (state.videoBuffer.length > 1) {
state.videoBuffer.removeAt(0);
} else {
// //
// frameTimestamps.add(DateTime.now().millisecondsSinceEpoch);
// // FPS
// _updateFps(frameTimestamps);
_playVideoData(state.videoBuffer.removeAt(0));
}
}
@ -371,7 +345,8 @@ class TalkViewLogic extends BaseGetXController {
}
///
StartChartManage().changeTalkExpectDataType(talkExpect: talkExpectReq);
StartChartManage().changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(
talkExpect: talkExpectReq);
state.isOpenVoice.value = !state.isOpenVoice.value;
}

View File

@ -81,26 +81,29 @@ class _TalkViewPageState extends State<TalkViewPage>
canPop: false,
child: RepaintBoundary(
key: state.globalKey,
child: Image.memory(
state.listData.value,
gaplessPlayback: true,
width: 1.sw,
height: 1.sh,
fit: BoxFit.cover,
filterQuality: FilterQuality.high,
errorBuilder: (
BuildContext context,
Object error,
StackTrace? stackTrace,
) {
return Container(color: Colors.transparent);
},
child: RotatedBox(
quarterTurns: 1, // 90 1
child: Image.memory(
state.listData.value,
gaplessPlayback: true,
width: 1.sw,
height: 1.sh,
fit: BoxFit.cover,
filterQuality: FilterQuality.high,
errorBuilder: (
BuildContext context,
Object error,
StackTrace? stackTrace,
) {
return Container(color: Colors.transparent);
},
),
),
),
),
),
),
Obx(() => state.talkStatus.value == TalkStatus.answeredSuccessfully
Obx(() => state.listData.value.isEmpty
? Positioned(
bottom: 300.h,
child: Text(
@ -141,7 +144,7 @@ class _TalkViewPageState extends State<TalkViewPage>
// ),
// ),
// ),
Obx(() => state.talkStatus.value == TalkStatus.answeredSuccessfully
Obx(() => state.listData.value.isEmpty
? buildRotationTransition()
: Container())
],
@ -154,7 +157,7 @@ class _TalkViewPageState extends State<TalkViewPage>
//
GestureDetector(
onTap: () {
if (state.talkStatus.value == TalkStatus.duringCall) {
if (state.talkStatus.value == TalkStatus.answeredSuccessfully) {
//
logic.updateTalkExpect();
}
@ -177,7 +180,7 @@ class _TalkViewPageState extends State<TalkViewPage>
//
GestureDetector(
onTap: () async {
if (state.talkStatus.value == TalkStatus.duringCall) {
if (state.talkStatus.value == TalkStatus.answeredSuccessfully) {
await logic.captureAndSavePng();
}
},
@ -196,7 +199,7 @@ class _TalkViewPageState extends State<TalkViewPage>
//
GestureDetector(
onTap: () async {
if (state.talkStatus.value == TalkStatus.duringCall) {
if (state.talkStatus.value == TalkStatus.answeredSuccessfully) {
if (state.isRecordingScreen.value) {
await logic.stopRecording();
print('停止录屏');
@ -245,8 +248,7 @@ class _TalkViewPageState extends State<TalkViewPage>
getAnswerBtnName(),
Colors.white,
longPress: () async {
if (state.talkStatus.value == TalkStatus.answeredSuccessfully ||
state.talkStatus.value == TalkStatus.duringCall) {
if (state.talkStatus.value == TalkStatus.answeredSuccessfully) {
print('开始录音');
logic.startProcessingAudio();
}
@ -283,7 +285,6 @@ class _TalkViewPageState extends State<TalkViewPage>
case TalkStatus.waitingAnswer:
return 'images/main/icon_lockDetail_monitoringAnswerCalls.png';
case TalkStatus.answeredSuccessfully:
case TalkStatus.duringCall:
return 'images/main/icon_lockDetail_monitoringUnTalkback.png';
default:
return 'images/main/icon_lockDetail_monitoringAnswerCalls.png';
@ -295,7 +296,6 @@ class _TalkViewPageState extends State<TalkViewPage>
case TalkStatus.waitingAnswer:
return '接听'.tr;
case TalkStatus.answeredSuccessfully:
case TalkStatus.duringCall:
return '长按说话'.tr;
default:
return '接听'.tr;

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:get/get_rx/get_rx.dart';
import 'package:get/get_rx/src/rx_types/rx_types.dart';
import 'package:network_info_plus/network_info_plus.dart';
import 'package:star_lock/talk/startChart/constant/talk_status.dart';
import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.dart';
@ -71,11 +72,12 @@ class TalkViewState {
RxBool isRecordingScreen = false.obs; //
RxBool isRecordingAudio = false.obs; //
Rx<DateTime> startRecordingAudioTime = DateTime.now().obs; //
Rx<DateTime> endRecordingAudioTime= DateTime.now().obs; //
RxInt recordingAudioTime= 0.obs; //
Rx<DateTime> endRecordingAudioTime = DateTime.now().obs; //
RxInt recordingAudioTime = 0.obs; //
RxDouble fps = 0.0.obs; // FPS
late VoiceProcessor? voiceProcessor; //
final int frameLength = 320; //320
final int sampleRate = 8000; //8000
List<List<int>> recordingAudioAllFrames = <List<int>>[]; //
RxInt rotateAngle = 0.obs; //
}