fix:调整切换清晰度逻辑

This commit is contained in:
liyi 2025-06-23 16:00:37 +08:00
parent ce193a2195
commit 293716f146

View File

@ -52,6 +52,15 @@ class TalkViewNativeDecodeLogic extends BaseGetXController {
int audioBufferSize = 2; // 2 int audioBufferSize = 2; // 2
// frameSeq较小时阈值也小
int _getFrameSeqRolloverThreshold(int lastSeq) {
if (lastSeq > 2000) {
return 1000;
} else {
return (lastSeq / 2).round();
}
}
// //
final List<int> _bufferedAudioFrames = <int>[]; final List<int> _bufferedAudioFrames = <int>[];
@ -163,28 +172,35 @@ class TalkViewNativeDecodeLogic extends BaseGetXController {
int frameSeqI, int frameSeqI,
ScpMessage scpMessage, ScpMessage scpMessage,
) { ) {
// frameSeq回绕I帧
// frameSeq较小时阈值也小
if (!_pendingStreamReset && if (!_pendingStreamReset &&
_lastFrameSeq != null && _lastFrameSeq != null &&
frameType == TalkDataH264Frame_FrameTypeE.I && frameType == TalkDataH264Frame_FrameTypeE.I &&
frameSeq < _lastFrameSeq!) { frameSeq < _lastFrameSeq!) {
// I帧loading并重置所有本地状态 int dynamicThreshold = _getFrameSeqRolloverThreshold(_lastFrameSeq!);
AppLog.log( if ((_lastFrameSeq! - frameSeq) > dynamicThreshold) {
'检测到新流I帧frameSeq回绕进入loading并重置: frameSeq=$frameSeq, lastFrameSeq=$_lastFrameSeq'); // I帧frameSeq大幅回绕loading并重置所有本地状态
Future.microtask(() => state.isLoading.value = true); AppLog.log('检测到新流I帧frameSeq大幅回绕进入loading并重置: frameSeq=$frameSeq, lastFrameSeq=$_lastFrameSeq, 阈值=$dynamicThreshold');
_pendingStreamReset = true; Future.microtask(() => state.isLoading.value = true);
// _pendingStreamReset = true;
_stopFrameProcessTimer(); //
// _stopFrameProcessTimer();
_resetDecoderForNewStream(_pendingResetWidth, _pendingResetHeight); //
// _resetDecoderForNewStream(_pendingResetWidth, _pendingResetHeight);
_lastFrameSeq = null; //
_decodedIFrames.clear(); _lastFrameSeq = null;
state.h264FrameBuffer.clear(); _decodedIFrames.clear();
// state.h264FrameBuffer.clear();
_startFrameProcessTimer(); //
// returnI帧初始化解码器并解码 _startFrameProcessTimer();
// // returnI帧初始化解码器并解码
//
} else {
//
AppLog.log('检测到I帧乱序未超过回绕阈值$dynamicThreshold),丢弃: frameSeq=$frameSeq, lastFrameSeq=$_lastFrameSeq');
return;
}
} }
// pendingStreamResetI帧 // pendingStreamResetI帧
if (_pendingStreamReset) { if (_pendingStreamReset) {