我使用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次。