在discord.py中是否有类似于discord.js中的streamTime的东西?



我使用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有类似的东西吗?如果不是,还有比计算进度更好的方法吗?

更新:我已经忘记了我写的这篇文章,但是自从我发现了一个非常好的解决这个问题的方法。

我所做的是创建一个自定义类来计算玩家读取的字节数。(感谢这个问题,我做了)

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)中被进一步删除,并根据重新添加。
  • 说到你的主要问题,Discord.py已经停用,并且从现在开始将不会收到来自开发人员的任何更新,以前它没有无论如何,有任何这样的方法来访问客户端的流(语音/视频-不适用于bot用户)的流时间。您可以参考文档的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)

我在player.py (discord.py的一个模块)中发现了这段代码,它负责播放音频:

while not self._end.is_set():
# are we paused?
if not self._resumed.is_set():
# wait until we aren't
self._resumed.wait()
continue
# are we disconnected from voice?
if not self._connected.is_set():
# wait until we are connected
self._connected.wait()
# reset our internal data
self.loops = 0
self._start = time.perf_counter()
self.loops += 1
data = self.source.read()
if not data:
self.stop()
break
play_audio(data, encode=not self.source.is_opus())
next_time = self._start + self.DELAY * self.loops
delay = max(0, self.DELAY + (next_time - time.perf_counter()))
time.sleep(delay)

因此:

loop_count = ctx.voice_client._player.loops

这给出了播放线程经过的循环计数,这对于表示音频的时间位置很有用。

time_position_in_second = loop_count // 50

我还建议将其分解为50,将其转换为秒,因为循环每20毫秒运行一次,即每秒运行50次。

最新更新