我使用包 youtube_dl
来执行播放音乐命令。
一段时间后,现在我一直在研究倒带和前进命令,我已经使用 ffmpeg 选项实现了基本的搜索命令,所以剩下的唯一的事情就是找到轨道的位置由机器人播放,这样我就可以寻找(位置+-)去到轨道的那个位置。我唯一想到的就是像这样计算轨道的进度。
async def count_progress(self):
try:
if not self.on_count:
self.on_count = True
while self.is_playing:
await asyncio.sleep(0.99)
self.queue._queue[0].progress += 1
self.on_count = False
except (AttributeError, IndexError):
self.on_count = False
我发现discord.js有一个叫做streamTime
的东西,discord.py
中有类似的东西吗?如果没有,除了计算进度之外,还有什么更好的方法吗?
更新:我已经忘记了我发表的这篇文章,但自从我找到了解决这个问题的一个非常好的解决方案。
我所做的是创建一个自定义类来计算播放器读取的字节数。 (感谢这个issue我做的)
class CalculableAudio(discord.PCMVolumeTransformer):
def __init__(self, original, start, volume: float):
self.played = start
super().__init__(original, volume=volume)
def read(self) -> bytes:
self.played += 20 # reading 20 frames at a time (1 sec = 1000 frames)
return super().read()
然后每当我想找到播放的秒数时,我只需要这样做:
seconds_played = ctx.voice_client.source.played//1000
最佳答案
这里有一些东西可供您使用!
TL;DR - 不,discord.py 中从来不存在这样的事情,而且永远不会。
- 在discord.js v12中曾经有一个 StreamDispatcher 其中有一个 StreamDispatcher.streamTime 属性在 v13 (discord.js) 中被进一步删除,并按照 this commit 重新添加 在官方 Discord.js 存储库上。
- 谈到您的主要问题,Discord.py 已停止使用,从现在起将不会收到开发者的任何更新,而之前它是这样做的无论如何,没有任何此类方法来访问客户端流的流时间(语音/视频 - 不适用于机器人用户)。您可以引用documentation's VoiceClient 部分并亲自检查在任何时候都不存在这样的属性/方法。
虽然Python本身是为你服务的!您可以声明一个开始播放时间的变量,然后从现在的时间中减去它!
# when command is first used save it to a database or as a variable simply :P starttime = datetime.datetime.utcnow()
@client.command()
async def playtime(ctx):
time = datetime.datetime.utcnow() - starttime
time = str(uptime).split(".")[0]
embed = discord.Embed(title="Total playtime", description=f"**time** = " + '' + time +'')
await ctx.send(embed=embed)
关于python - 在discord.py中是否有类似于discord.js中的streamTime的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69013764/