Spotipy音频分析:遍历小节起始时间遇迭代错误及同步问题
音频小节遍历的错误修复与进度匹配方案
错误原因分析
- TypeError 根源:
for x in int(round(bst * 1000))这行代码把整数当成可迭代对象遍历,Python直接报错——整数本身不能被循环。另外你写的for cds in bar完全多余,bar是字典,循环它只会拿到'start'、'duration'这类键名,对实现需求毫无帮助。 - 进度匹配失效:直接用
==比较毫秒/秒转换后的数值,会因浮点运算精度丢失导致永远匹配不上。比如小节起始秒数0.36043转毫秒是360,但实际进度可能是360或361,精准相等判断必然失败。
修正后的代码
def get_audio_data(): artist, track, tid, progress = get_current_song() analysis = spotify.audio_analysis(tid) bars = analysis["bars"] # 遍历每个音频小节 for bar in bars: bar_start_sec = bar["start"] # 把小节起始时间转成毫秒(和进度单位统一) bar_start_ms = int(round(bar_start_sec * 1000)) # 打印小节起始时间(按需调整输出内容) print(f"当前小节起始毫秒:{bar_start_ms}") # 用误差范围判断进度匹配,避免精度问题(允许±10ms误差) if abs(progress - bar_start_ms) <= 10: print("BLEEP BLOOP!")
关键修复点
- 移除无意义的
for cds in bar循环,直接从字典bar提取start值; - 把错误的整数循环改成直接计算小节起始毫秒值,贴合你获取节拍时间的需求;
- 用误差范围判断替代精准相等:设置±10ms的容错范围,解决浮点精度导致的匹配失败问题,你也可以根据实际需求调整阈值(比如±5ms)。
内容的提问来源于stack exchange,提问作者error500
相关产品推荐
相关产品推荐

