discord.py是否存在类似discord.js中streamTime的对应功能?
Discord.py 播放进度获取方案解答
discord.py 原生没有内置类似 discord.js 中 streamTime 的直接获取播放进度的属性,你最初用异步睡眠手动计数的方案误差较大,遇到流加载卡顿、播放暂停、队列切换时容易出现计数和实际进度错位的问题,不是最优选择。
你后续找到的通过自定义 PCMVolumeTransformer 子类统计读取帧数的方案,是目前该场景下的最优实现,误差极小且天然适配播放暂停、seek 跳转等需求,核心逻辑是利用 discord 语音播放每次 read() 固定读取20ms音频帧的特性,累计总读取时长得到实际播放进度,不需要额外的异步计数任务,性能开销也更低。
优化后的完整实现代码
class CalculableAudio(discord.PCMVolumeTransformer): def __init__(self, original, start, volume: float): # start参数为seek跳转的起始毫秒数,没有跳转时传0即可 self.played = start super().__init__(original, volume=volume) def read(self) -> bytes: # 每次read固定读取20ms音频帧,累计计数 self.played += 20 return super().read()
使用方式
需要获取已播放时长时直接调用以下代码即可:
seconds_played = ctx.voice_client.source.played // 1000
快进快退适配
你已经实现了ffmpeg的seek基础指令,只需要在跳转时同时将CalculableAudio实例的played属性设置为跳转后的毫秒数,即可直接同步进度,不需要调整其他逻辑。
内容的提问来源于stack exchange,提问作者kilkuwu
相关产品推荐
相关产品推荐

