fix:调整视频帧缓冲区逻辑计算逻辑,增加缓冲区最大大小至20帧
This commit is contained in:
parent
5864b29055
commit
47b0a18ef3
@ -56,6 +56,9 @@ class TalkViewLogic extends BaseGetXController {
|
||||
|
||||
final Map<String, ui.Image> _imageCache = {};
|
||||
|
||||
// 添加一个变量用于记录上一帧的时间戳
|
||||
int _lastFrameTimestamp = 0; // 初始值为 0
|
||||
|
||||
// 添加帧率计算相关变量
|
||||
int _frameCount = 0;
|
||||
int _lastFpsUpdateTime = 0;
|
||||
@ -100,11 +103,11 @@ class TalkViewLogic extends BaseGetXController {
|
||||
// 判断数据类型,进行分发处理
|
||||
switch (contentType) {
|
||||
case TalkData_ContentTypeE.G711:
|
||||
// 第一帧到达时记录开始时间
|
||||
if (_isFirstAudioFrame) {
|
||||
_startAudioTime = currentTime;
|
||||
_isFirstAudioFrame = false;
|
||||
}
|
||||
// // 第一帧到达时记录开始时间
|
||||
// if (_isFirstAudioFrame) {
|
||||
// _startAudioTime = currentTime;
|
||||
// _isFirstAudioFrame = false;
|
||||
// }
|
||||
|
||||
// 计算音频延迟
|
||||
final expectedTime = _startAudioTime + talkData.durationMs;
|
||||
@ -130,15 +133,16 @@ class TalkViewLogic extends BaseGetXController {
|
||||
if (_isFirstFrame) {
|
||||
_startTime = currentTime;
|
||||
_isFirstFrame = false;
|
||||
// AppLog.log('记录第一帧的时间戳${currentTime},${talkData.durationMs}');
|
||||
AppLog.log('第一帧帧的时间戳:${talkData.durationMs}');
|
||||
}
|
||||
// AppLog.log('其他帧的时间戳:${talkData.durationMs}');
|
||||
// 计算帧间间隔
|
||||
if (_lastFrameTimestamp != 0) {
|
||||
final int frameInterval = talkData.durationMs - _lastFrameTimestamp;
|
||||
_adjustBufferSize(frameInterval); // 根据帧间间隔调整缓冲区
|
||||
}
|
||||
_lastFrameTimestamp = talkData.durationMs; // 更新上一帧时间戳
|
||||
|
||||
// 计算实际延迟:当前时间 - 预期播放时间
|
||||
final expectedTime = _startTime + talkData.durationMs;
|
||||
final videoDelay = currentTime - expectedTime; // 修改延迟计算方式
|
||||
|
||||
// 动态调整缓冲区
|
||||
_adjustBufferSize(videoDelay);
|
||||
// 然后添加到播放缓冲区
|
||||
if (state.videoBuffer.length >= bufferSize) {
|
||||
state.videoBuffer.removeAt(0);
|
||||
@ -257,19 +261,21 @@ class TalkViewLogic extends BaseGetXController {
|
||||
}
|
||||
|
||||
// 新增:动态调整缓冲区大小的方法
|
||||
void _adjustBufferSize(int delay) {
|
||||
const int delayThresholdHigh = 250; // 高延迟阈值(约3帧的时间)
|
||||
const int delayThresholdLow = 166; // 低延迟阈值(约2帧的时间)
|
||||
void _adjustBufferSize(int frameInterval) {
|
||||
const int frameDuration = 83; // 假设每帧的时间间隔为 83ms(12fps)
|
||||
const int delayThresholdHigh = frameDuration * 2; // 高延迟阈值(2帧时间)
|
||||
const int delayThresholdLow = frameDuration; // 低延迟阈值(1帧时间)
|
||||
const int adjustInterval = 1; // 每次调整1帧
|
||||
|
||||
if (delay > delayThresholdHigh && bufferSize < maxBufferSize) {
|
||||
// 延迟较大,增加缓冲区
|
||||
if (frameInterval > delayThresholdHigh && bufferSize < maxBufferSize) {
|
||||
// 帧间间隔较大,增加缓冲区
|
||||
bufferSize = min(bufferSize + adjustInterval, maxBufferSize);
|
||||
// AppLog.log('📈 增加缓冲区 - 当前大小: $bufferSize, 延迟: ${delay}ms');
|
||||
} else if (delay < delayThresholdLow && bufferSize > minBufferSize) {
|
||||
// 延迟较小,减少缓冲区
|
||||
AppLog.log('📈 增加缓冲区 - 当前大小: $bufferSize, 帧间间隔: ${frameInterval}ms');
|
||||
} else if (frameInterval < delayThresholdLow &&
|
||||
bufferSize > minBufferSize) {
|
||||
// 帧间间隔较小,减少缓冲区
|
||||
bufferSize = max(bufferSize - adjustInterval, minBufferSize);
|
||||
// AppLog.log('📉 减少缓冲区 - 当前大小: $bufferSize, 延迟: ${delay}ms');
|
||||
AppLog.log('📉 减少缓冲区 - 当前大小: $bufferSize, 帧间间隔: ${frameInterval}ms');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user