fix:增加缓冲区逻辑
This commit is contained in:
parent
4234464533
commit
a259ed9dd3
@ -2,7 +2,6 @@ import 'dart:async';
|
|||||||
import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
|
import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
|
||||||
|
|
||||||
class TalkDataRepository {
|
class TalkDataRepository {
|
||||||
// 创建一个私有的构造函数,防止外部创建实例
|
|
||||||
TalkDataRepository._() {
|
TalkDataRepository._() {
|
||||||
_talkDataStreamController = StreamController<TalkData>.broadcast(
|
_talkDataStreamController = StreamController<TalkData>.broadcast(
|
||||||
onListen: () {
|
onListen: () {
|
||||||
@ -11,47 +10,26 @@ class TalkDataRepository {
|
|||||||
onCancel: () {
|
onCancel: () {
|
||||||
_isListening = false;
|
_isListening = false;
|
||||||
},
|
},
|
||||||
sync: false, // 异步模式
|
sync: false, // 改为同步模式以提高实时性
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用 _instance 来保存单例对象
|
|
||||||
static final TalkDataRepository _instance = TalkDataRepository._();
|
static final TalkDataRepository _instance = TalkDataRepository._();
|
||||||
|
|
||||||
// 提供一个静态方法来获取单例实例
|
|
||||||
static TalkDataRepository get instance => _instance;
|
static TalkDataRepository get instance => _instance;
|
||||||
|
|
||||||
// 创建一个 StreamController
|
|
||||||
late final StreamController<TalkData> _talkDataStreamController;
|
late final StreamController<TalkData> _talkDataStreamController;
|
||||||
|
|
||||||
bool _isListening = false;
|
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) {
|
void addTalkData(TalkData talkData) {
|
||||||
if (_isListening) {
|
if (_isListening) {
|
||||||
_talkDataStreamController.add(talkData);
|
_talkDataStreamController.add(talkData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 提供一个方法来关闭 StreamController
|
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_talkDataStreamController.close();
|
_talkDataStreamController.close();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,8 +38,8 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
final LockDetailState lockDetailState = Get.put(LockDetailLogic()).state;
|
final LockDetailState lockDetailState = Get.put(LockDetailLogic()).state;
|
||||||
|
|
||||||
final int minBufferSize = 2; // 最小缓冲2帧,约166ms
|
final int minBufferSize = 2; // 最小缓冲2帧,约166ms
|
||||||
final int maxBufferSize = 8; // 最大缓冲8帧,约666ms
|
final int maxBufferSize = 20; // 最大缓冲8帧,约666ms
|
||||||
int bufferSize = 20; // 初始化为默认大小
|
int bufferSize = 8; // 初始化为默认大小
|
||||||
// 修改音频相关的成员变量
|
// 修改音频相关的成员变量
|
||||||
final int minAudioBufferSize = 1; // 音频最小缓冲1帧
|
final int minAudioBufferSize = 1; // 音频最小缓冲1帧
|
||||||
final int maxAudioBufferSize = 3; // 音频最大缓冲3帧
|
final int maxAudioBufferSize = 3; // 音频最大缓冲3帧
|
||||||
@ -137,11 +137,11 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
}
|
}
|
||||||
// AppLog.log('其他帧的时间戳:${talkData.durationMs}');
|
// AppLog.log('其他帧的时间戳:${talkData.durationMs}');
|
||||||
// 计算帧间间隔
|
// 计算帧间间隔
|
||||||
// if (_lastFrameTimestamp != 0) {
|
if (_lastFrameTimestamp != 0) {
|
||||||
// final int frameInterval = talkData.durationMs - _lastFrameTimestamp;
|
final int frameInterval = talkData.durationMs - _lastFrameTimestamp;
|
||||||
// _adjustBufferSize(frameInterval); // 根据帧间间隔调整缓冲区
|
_adjustBufferSize(frameInterval); // 根据帧间间隔调整缓冲区
|
||||||
// }
|
}
|
||||||
// _lastFrameTimestamp = talkData.durationMs; // 更新上一帧时间戳
|
_lastFrameTimestamp = talkData.durationMs; // 更新上一帧时间戳
|
||||||
|
|
||||||
// 然后添加到播放缓冲区
|
// 然后添加到播放缓冲区
|
||||||
if (state.videoBuffer.length >= bufferSize) {
|
if (state.videoBuffer.length >= bufferSize) {
|
||||||
@ -184,7 +184,7 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
state.listData.value = Uint8List.fromList(oldestFrame.content);
|
state.listData.value = Uint8List.fromList(oldestFrame.content);
|
||||||
state.videoBuffer.removeAt(oldestIndex); // 移除已播放的帧
|
state.videoBuffer.removeAt(oldestIndex); // 移除已播放的帧
|
||||||
|
|
||||||
// 更新帧率计算
|
// // 更新帧率计算
|
||||||
// _frameCount++;
|
// _frameCount++;
|
||||||
// final currentTime = DateTime.now().millisecondsSinceEpoch;
|
// final currentTime = DateTime.now().millisecondsSinceEpoch;
|
||||||
// final elapsed = currentTime - _lastFpsUpdateTime;
|
// final elapsed = currentTime - _lastFpsUpdateTime;
|
||||||
@ -195,9 +195,7 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
// _frameCount = 0;
|
// _frameCount = 0;
|
||||||
// _lastFpsUpdateTime = currentTime;
|
// _lastFpsUpdateTime = currentTime;
|
||||||
// }
|
// }
|
||||||
// AppLog.log('🎬 播放帧 - 缓冲区剩余: ${state.videoBuffer.length}/${bufferSize}, '
|
|
||||||
// '播放延迟: ${currentTime - oldestFrame.durationMs}ms, '
|
|
||||||
// '帧时间戳: ${oldestFrame.durationMs}');
|
|
||||||
} else {
|
} else {
|
||||||
// AppLog.log('⚠️ 帧未找到缓存 - Key: $cacheKey');
|
// AppLog.log('⚠️ 帧未找到缓存 - Key: $cacheKey');
|
||||||
state.videoBuffer.removeAt(oldestIndex); // 移除无法播放的帧
|
state.videoBuffer.removeAt(oldestIndex); // 移除无法播放的帧
|
||||||
@ -499,6 +497,7 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
_initAudioRecorder();
|
_initAudioRecorder();
|
||||||
|
|
||||||
requestPermissions();
|
requestPermissions();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user