2.8 KiB
2.8 KiB
缓存音频播放时序修复总结
问题描述
在打招呼读取缓存播放时,发现有时会立即触发播放完成,显示异常的时间差(49.292秒),导致缓存音频无法正常播放完整。
根本原因
在 _process_cached_audio 方法中,缓存音频的处理存在时序问题:
- 立即设置完成状态:缓存音频被添加到预加载缓冲区后,立即设置
all_audio_received = True - 时序变量未初始化:
last_audio_chunk_time没有在缓存音频开始播放时正确设置 - 完成检测误判:播放完成检测逻辑使用旧的或零值的
last_audio_chunk_time,计算出异常的时间差,误判播放已完成
修复方案
1. 修改 _process_cached_audio 方法
- 延迟设置
all_audio_received:不在音频添加到缓冲区时立即设置,而是等待实际开始播放时设置 - 正确初始化时序变量:在缓存音频开始播放时设置
last_audio_chunk_time = time.time() - 确保时序同步:保证
all_audio_received和last_audio_chunk_time在正确的时间点设置
2. 修改音频缓冲区转移逻辑
在以下缓冲区转移场景中也添加了时序变量初始化:
- 预加载缓冲区达到阈值时
- 最小缓冲区模式启动时
- 强制转移预加载缓冲区时
3. 关键修改点
在 _process_cached_audio 中:
# 修复前:立即设置all_audio_received
self.all_audio_received = True
# 修复后:等待播放开始时设置
self.last_audio_chunk_time = time.time() # 关键修复
self.all_audio_received = True
在缓冲区转移逻辑中:
# 在各种缓冲区转移场景中添加
self.last_audio_chunk_time = time.time()
print(f"🎵 设置last_audio_chunk_time = {self.last_audio_chunk_time}")
修复效果
- 解决立即完成问题:缓存音频不再出现49.292秒的异常时间差
- 确保完整播放:缓存音频能够正常播放完整时长
- 时序同步:播放完成检测逻辑现在使用正确的时间戳
- 避免死锁:即使在异常情况下,也能正确设置完成状态避免系统卡死
测试验证
创建了专门的测试脚本 test_cached_timing_fix.py 验证修复效果:
- ✅ 关键时序变量存在且可访问
- ✅ 时序变量可以正确设置和读取
- ✅ 时间差计算正常(接近0秒而非49.292秒)
- ✅ 异常时间差问题得到解决
影响范围
- 缓存音频播放:修复了所有缓存音频的播放时序问题
- 播放完成检测:改进了播放完成检测的准确性
- 系统稳定性:提高了整个音频播放系统的稳定性
这个修复确保了缓存音频(如角色打招呼)能够正常播放完整,不会立即触发播放完成。