提问者:小点点

如何制作不和谐音乐机器人来识别歌曲的结尾或播放位置


我正在尝试使用此代码制作一个不和谐的音乐机器人。[https://github.com/afazio1/robotic-nation-proj/blob/master/projects/discord-bot/voice.py]

我想添加一个功能,机器人自动检查音乐队列是否为空,并在机器人播放完后向队列中添加几首歌曲。我如何让这个机器人识别它何时播放完?

我想过添加一个计时器。当音乐开始时,机器人记录系统时间,并添加歌曲长度。这样机器人就可以预测歌曲何时结束。但是这种方法有一个缺陷——如果用户暂停并恢复歌曲,机器人会添加新歌并跳过当前歌曲,即使歌曲还没有播放完。

附言:我见过这种代码voice.play(discord. FFmpegPCMAudio("song.mp3"),在=lambda e:check_queue()之后)我不认为这不是我要找的,因为我的目的是让机器人自动添加新音乐到队列和播放音乐。


共1个答案

匿名用户

我想出了当当前歌曲结束时如何播放下一首歌曲。实际上,我不需要计时器。定义一个从队列中弹出歌曲并播放的函数。然后将其放入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秒)机器人提前识别并下载一首歌曲。这样我就可以毫无延迟地听新歌。(从队列中弹出一首歌并下载需要时间。)这就是我写这个问题的原因。现在我发现我没有正确解释它。

最终,我放弃了实现这个方法。我将等待我的机器人下载新歌。