fix:增加对讲时的通话计时、调整对讲时画布旋转逻辑
This commit is contained in:
parent
9527f8e019
commit
9504a97bde
@ -50,7 +50,6 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
int audioFrameIntervalMs = 20; // 初始帧间隔设置为45毫秒(约22FPS)
|
int audioFrameIntervalMs = 20; // 初始帧间隔设置为45毫秒(约22FPS)
|
||||||
int minFrameIntervalMs = 30; // 最小帧间隔(约33 FPS)
|
int minFrameIntervalMs = 30; // 最小帧间隔(约33 FPS)
|
||||||
int maxFrameIntervalMs = 100; // 最大帧间隔(约1 FPS)
|
int maxFrameIntervalMs = 100; // 最大帧间隔(约1 FPS)
|
||||||
// int maxFrameIntervalMs = 100; // 最大帧间隔(约10 FPS)
|
|
||||||
|
|
||||||
/// 初始化音频播放器
|
/// 初始化音频播放器
|
||||||
void _initFlutterPcmSound() {
|
void _initFlutterPcmSound() {
|
||||||
@ -118,6 +117,17 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
case TalkStatus.end:
|
case TalkStatus.end:
|
||||||
_handleInvalidTalkStatus();
|
_handleInvalidTalkStatus();
|
||||||
break;
|
break;
|
||||||
|
case TalkStatus.answeredSuccessfully:
|
||||||
|
state.oneMinuteTimeTimer?.cancel(); // 取消旧定时器
|
||||||
|
state.oneMinuteTimeTimer ??=
|
||||||
|
Timer.periodic(const Duration(seconds: 1), (Timer t) {
|
||||||
|
state.oneMinuteTime.value++;
|
||||||
|
if (state.oneMinuteTime.value >= 60) {
|
||||||
|
t.cancel(); // 取消定时器
|
||||||
|
state.oneMinuteTime.value = 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// 其他状态的处理
|
// 其他状态的处理
|
||||||
break;
|
break;
|
||||||
@ -160,12 +170,6 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
/// 动态调整帧间隔
|
/// 动态调整帧间隔
|
||||||
void _adjustFrameInterval() {
|
void _adjustFrameInterval() {
|
||||||
int newFrameIntervalMs = frameIntervalMs;
|
int newFrameIntervalMs = frameIntervalMs;
|
||||||
if (state.networkStatus.value == NetworkStatus.lagging) {
|
|
||||||
bufferSize = 60; // 增大缓冲区
|
|
||||||
} else {
|
|
||||||
bufferSize = 40; // 恢复默认缓冲区大小
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state.videoBuffer.length < 10 && frameIntervalMs < maxFrameIntervalMs) {
|
if (state.videoBuffer.length < 10 && frameIntervalMs < maxFrameIntervalMs) {
|
||||||
// 如果缓冲区较小且帧间隔小于最大值,则增加帧间隔
|
// 如果缓冲区较小且帧间隔小于最大值,则增加帧间隔
|
||||||
frameIntervalMs += 5;
|
frameIntervalMs += 5;
|
||||||
@ -442,7 +446,8 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
_syncTimer = null; // 释放定时器引用
|
_syncTimer = null; // 释放定时器引用
|
||||||
_audioTimer?.cancel();
|
_audioTimer?.cancel();
|
||||||
_audioTimer = null; // 释放定时器引用
|
_audioTimer = null; // 释放定时器引用
|
||||||
|
state.oneMinuteTimeTimer?.cancel();
|
||||||
|
state.oneMinuteTimeTimer = null;
|
||||||
stopProcessingAudio();
|
stopProcessingAudio();
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -107,13 +107,13 @@ class _TalkViewPageState extends State<TalkViewPage>
|
|||||||
canPop: false,
|
canPop: false,
|
||||||
child: RepaintBoundary(
|
child: RepaintBoundary(
|
||||||
key: state.globalKey,
|
key: state.globalKey,
|
||||||
child: Transform.rotate(
|
child: SizedBox.expand(
|
||||||
angle:
|
child: RotatedBox(
|
||||||
state.rotateAngle.value * (pi / 180), // 旋转 90 度
|
quarterTurns: -1,
|
||||||
child: Transform.scale(
|
|
||||||
scale: scale, // 动态计算的缩放比例
|
|
||||||
child: Image.memory(
|
child: Image.memory(
|
||||||
state.listData.value,
|
state.listData.value,
|
||||||
|
width: ScreenUtil().scaleWidth,
|
||||||
|
height: ScreenUtil().scaleHeight,
|
||||||
gaplessPlayback: true,
|
gaplessPlayback: true,
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
filterQuality: FilterQuality.high,
|
filterQuality: FilterQuality.high,
|
||||||
@ -139,6 +139,34 @@ class _TalkViewPageState extends State<TalkViewPage>
|
|||||||
style: TextStyle(color: Colors.black, fontSize: 26.sp),
|
style: TextStyle(color: Colors.black, fontSize: 26.sp),
|
||||||
))
|
))
|
||||||
: Container()),
|
: Container()),
|
||||||
|
Obx(
|
||||||
|
() => state.listData.value.isNotEmpty
|
||||||
|
? Positioned(
|
||||||
|
top: ScreenUtil().statusBarHeight + 75.h,
|
||||||
|
width: 1.sw,
|
||||||
|
child: Obx(
|
||||||
|
() {
|
||||||
|
final String sec = (state.oneMinuteTime.value % 60)
|
||||||
|
.toString()
|
||||||
|
.padLeft(2, '0');
|
||||||
|
final String min = (state.oneMinuteTime.value ~/ 60)
|
||||||
|
.toString()
|
||||||
|
.padLeft(2, '0');
|
||||||
|
return Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Text(
|
||||||
|
'$min:$sec',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 26.sp, color: Colors.white),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: Container(),
|
||||||
|
),
|
||||||
Positioned(
|
Positioned(
|
||||||
bottom: 10.w,
|
bottom: 10.w,
|
||||||
child: Container(
|
child: Container(
|
||||||
|
|||||||
@ -37,8 +37,7 @@ class TalkViewState {
|
|||||||
RxList<int> listAudioData = <int>[].obs; //得到的音频流字节数据
|
RxList<int> listAudioData = <int>[].obs; //得到的音频流字节数据
|
||||||
GlobalKey globalKey = GlobalKey();
|
GlobalKey globalKey = GlobalKey();
|
||||||
|
|
||||||
late Timer oneMinuteTimeTimer =
|
Timer? oneMinuteTimeTimer; // 定时器超过60秒关闭当前界面
|
||||||
Timer(const Duration(seconds: 1), () {}); // 定时器超过60秒关闭当前界面
|
|
||||||
RxInt oneMinuteTime = 0.obs; // 定时器秒数
|
RxInt oneMinuteTime = 0.obs; // 定时器秒数
|
||||||
|
|
||||||
// 定时器如果发送了接听的命令 而没收到回复就每秒重复发送10次
|
// 定时器如果发送了接听的命令 而没收到回复就每秒重复发送10次
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user