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 = {};
|
final Map<String, ui.Image> _imageCache = {};
|
||||||
|
|
||||||
|
// 添加一个变量用于记录上一帧的时间戳
|
||||||
|
int _lastFrameTimestamp = 0; // 初始值为 0
|
||||||
|
|
||||||
// 添加帧率计算相关变量
|
// 添加帧率计算相关变量
|
||||||
int _frameCount = 0;
|
int _frameCount = 0;
|
||||||
int _lastFpsUpdateTime = 0;
|
int _lastFpsUpdateTime = 0;
|
||||||
@ -100,11 +103,11 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
// 判断数据类型,进行分发处理
|
// 判断数据类型,进行分发处理
|
||||||
switch (contentType) {
|
switch (contentType) {
|
||||||
case TalkData_ContentTypeE.G711:
|
case TalkData_ContentTypeE.G711:
|
||||||
// 第一帧到达时记录开始时间
|
// // 第一帧到达时记录开始时间
|
||||||
if (_isFirstAudioFrame) {
|
// if (_isFirstAudioFrame) {
|
||||||
_startAudioTime = currentTime;
|
// _startAudioTime = currentTime;
|
||||||
_isFirstAudioFrame = false;
|
// _isFirstAudioFrame = false;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// 计算音频延迟
|
// 计算音频延迟
|
||||||
final expectedTime = _startAudioTime + talkData.durationMs;
|
final expectedTime = _startAudioTime + talkData.durationMs;
|
||||||
@ -130,15 +133,16 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
if (_isFirstFrame) {
|
if (_isFirstFrame) {
|
||||||
_startTime = currentTime;
|
_startTime = currentTime;
|
||||||
_isFirstFrame = false;
|
_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) {
|
if (state.videoBuffer.length >= bufferSize) {
|
||||||
state.videoBuffer.removeAt(0);
|
state.videoBuffer.removeAt(0);
|
||||||
@ -257,19 +261,21 @@ class TalkViewLogic extends BaseGetXController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 新增:动态调整缓冲区大小的方法
|
// 新增:动态调整缓冲区大小的方法
|
||||||
void _adjustBufferSize(int delay) {
|
void _adjustBufferSize(int frameInterval) {
|
||||||
const int delayThresholdHigh = 250; // 高延迟阈值(约3帧的时间)
|
const int frameDuration = 83; // 假设每帧的时间间隔为 83ms(12fps)
|
||||||
const int delayThresholdLow = 166; // 低延迟阈值(约2帧的时间)
|
const int delayThresholdHigh = frameDuration * 2; // 高延迟阈值(2帧时间)
|
||||||
|
const int delayThresholdLow = frameDuration; // 低延迟阈值(1帧时间)
|
||||||
const int adjustInterval = 1; // 每次调整1帧
|
const int adjustInterval = 1; // 每次调整1帧
|
||||||
|
|
||||||
if (delay > delayThresholdHigh && bufferSize < maxBufferSize) {
|
if (frameInterval > delayThresholdHigh && bufferSize < maxBufferSize) {
|
||||||
// 延迟较大,增加缓冲区
|
// 帧间间隔较大,增加缓冲区
|
||||||
bufferSize = min(bufferSize + adjustInterval, maxBufferSize);
|
bufferSize = min(bufferSize + adjustInterval, maxBufferSize);
|
||||||
// AppLog.log('📈 增加缓冲区 - 当前大小: $bufferSize, 延迟: ${delay}ms');
|
AppLog.log('📈 增加缓冲区 - 当前大小: $bufferSize, 帧间间隔: ${frameInterval}ms');
|
||||||
} else if (delay < delayThresholdLow && bufferSize > minBufferSize) {
|
} else if (frameInterval < delayThresholdLow &&
|
||||||
// 延迟较小,减少缓冲区
|
bufferSize > minBufferSize) {
|
||||||
|
// 帧间间隔较小,减少缓冲区
|
||||||
bufferSize = max(bufferSize - adjustInterval, 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