You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:54:01