我正在尝试使用此代码制作一个不和谐的音乐机器人。[https://github.com/afazio1/robotic-nation-proj/blob/master/projects/discord-bot/voice.py]
我想添加一个功能,机器人自动检查音乐队列是否为空,并在机器人播放完后向队列中添加几首歌曲。我如何让这个机器人识别它何时播放完?
我想过添加一个计时器。当音乐开始时,机器人记录系统时间,并添加歌曲长度。这样机器人就可以预测歌曲何时结束。但是这种方法有一个缺陷——如果用户暂停并恢复歌曲,机器人会添加新歌并跳过当前歌曲,即使歌曲还没有播放完。
附言:我见过这种代码voice.play(discord. FFmpegPCMAudio("song.mp3"),在=lambda e:check_queue()之后)我不认为这不是我要找的,因为我的目的是让机器人自动添加新音乐到队列和播放音乐。
我想出了当当前歌曲结束时如何播放下一首歌曲。实际上,我不需要计时器。定义一个从队列中弹出歌曲并播放的函数。然后将其放入voice.play函数的第二个参数中。
我是这么做的。
def after_song(err):
try :
if len(queue) > 0:
next_song = url_queue.pop(0)
queue.pop(0)
song_manager = Song()
_video_title = song_manager.do_both(next_song) #downloads song and returns video_title
voice.play(discord.FFmpegPCMAudio("song.mp3"), after=after_song)
else :
url_queue.pop(0)
queue.pop(0)
return
except IndexError :
pass
voice.play(discord.FFmpegPCMAudio("song.mp3"), after=after_song)
我参考了这段代码(第163到171行)https://github.com/joek13/py-music-bot/blob/master/musicbot/cogs/music.py
我最初的计划是在歌曲结束之前(离结束还有3秒)机器人提前识别并下载一首歌曲。这样我就可以毫无延迟地听新歌。(从队列中弹出一首歌并下载需要时间。)这就是我写这个问题的原因。现在我发现我没有正确解释它。
最终,我放弃了实现这个方法。我将等待我的机器人下载新歌。