fix:增加缓冲区逻辑

This commit is contained in:
liyi 2025-04-16 14:16:27 +08:00
parent 4234464533
commit a259ed9dd3
2 changed files with 13 additions and 36 deletions

View File

@ -2,7 +2,6 @@ import 'dart:async';
import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
class TalkDataRepository {
//
TalkDataRepository._() {
_talkDataStreamController = StreamController<TalkData>.broadcast(
onListen: () {
@ -11,47 +10,26 @@ class TalkDataRepository {
onCancel: () {
_isListening = false;
},
sync: false, //
sync: false, //
);
}
// 使 _instance
static final TalkDataRepository _instance = TalkDataRepository._();
//
static TalkDataRepository get instance => _instance;
// StreamController
late final StreamController<TalkData> _talkDataStreamController;
bool _isListening = false;
//
final List<TalkData> _buffer = [];
//
Stream<TalkData> get talkDataStream => _talkDataStreamController.stream;
// Stream
Stream<TalkData> get talkDataStream =>
_talkDataStreamController.stream.transform(
StreamTransformer<TalkData, TalkData>.fromHandlers(
handleData: (TalkData data, EventSink<TalkData> sink) {
// 100
if (_buffer.length >= 100) {
_buffer.removeAt(0); //
}
_buffer.add(data);
sink.add(data);
},
),
);
// TalkData Stream
void addTalkData(TalkData talkData) {
if (_isListening) {
_talkDataStreamController.add(talkData);
}
}
// StreamController
void dispose() {
_talkDataStreamController.close();
}

View File

@ -38,8 +38,8 @@ class TalkViewLogic extends BaseGetXController {
final LockDetailState lockDetailState = Get.put(LockDetailLogic()).state;
final int minBufferSize = 2; // 2166ms
final int maxBufferSize = 8; // 8666ms
int bufferSize = 20; //
final int maxBufferSize = 20; // 8666ms
int bufferSize = 8; //
//
final int minAudioBufferSize = 1; // 1
final int maxAudioBufferSize = 3; // 3
@ -137,11 +137,11 @@ class TalkViewLogic extends BaseGetXController {
}
// AppLog.log('其他帧的时间戳:${talkData.durationMs}');
//
// if (_lastFrameTimestamp != 0) {
// final int frameInterval = talkData.durationMs - _lastFrameTimestamp;
// _adjustBufferSize(frameInterval); //
// }
// _lastFrameTimestamp = talkData.durationMs; //
if (_lastFrameTimestamp != 0) {
final int frameInterval = talkData.durationMs - _lastFrameTimestamp;
_adjustBufferSize(frameInterval); //
}
_lastFrameTimestamp = talkData.durationMs; //
//
if (state.videoBuffer.length >= bufferSize) {
@ -184,7 +184,7 @@ class TalkViewLogic extends BaseGetXController {
state.listData.value = Uint8List.fromList(oldestFrame.content);
state.videoBuffer.removeAt(oldestIndex); //
//
// //
// _frameCount++;
// final currentTime = DateTime.now().millisecondsSinceEpoch;
// final elapsed = currentTime - _lastFpsUpdateTime;
@ -195,9 +195,7 @@ class TalkViewLogic extends BaseGetXController {
// _frameCount = 0;
// _lastFpsUpdateTime = currentTime;
// }
// AppLog.log('🎬 播放帧 - 缓冲区剩余: ${state.videoBuffer.length}/${bufferSize}, '
// '播放延迟: ${currentTime - oldestFrame.durationMs}ms, '
// '帧时间戳: ${oldestFrame.durationMs}');
} else {
// AppLog.log('⚠️ 帧未找到缓存 - Key: $cacheKey');
state.videoBuffer.removeAt(oldestIndex); //
@ -499,6 +497,7 @@ class TalkViewLogic extends BaseGetXController {
_initAudioRecorder();
requestPermissions();
}
@override