Discord.py music_cog,机器人加入频道但不播放声音

时间:2021-06-19 13:31:44

标签: python ffmpeg discord discord.py youtube-dl

我一周前开始使用 python。我已经在 YT 上观看了所有相关视频并检查了谷歌页面等。但仍然没有运气。我的机器人完美地加入了语音频道,当我使用播放时,它会下载并可能启动播放功能,但没有声音或任何东西,它只是加入并等待 1-2 分钟,然后离开时出现超时错误。

list [5,6,7,8,9]

我启用了日志以确保连接时只有该信息:

from discord.ext import commands import logging from youtube_dl import YoutubeDL logging.basicConfig(level=logging.INFO) class music_cog(commands.Cog): def __init__(self, bot): self.bot = bot # all the music related stuff self.is_playing = False # 2d array containing [song, channel] self.music_queue = [] self.YDL_OPTIONS = {'format': 'bestaudio', 'noplaylist': 'True', 'no_warnings': 'False'} self.FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'} self.vc = "" # searching the item on youtube def search_yt(self, item): with YoutubeDL(self.YDL_OPTIONS) as ydl: try: info = ydl.extract_info("ytsearch:%s" % item, download=False)['entries'][0] except Exception: return False return {'source': info['formats'][0]['url'], 'title': info['title']} def play_next(self): if len(self.music_queue) > 0: self.is_playing = True # get the first url m_url = self.music_queue[0][0]['source'] # remove the first element as you are currently playing it self.music_queue.pop(0) self.vc.play(discord.FFmpegPCMAudio(m_url, **self.FFMPEG_OPTIONS), after=lambda e: self.play_next()) else: self.is_playing = False # infinite loop checking async def play_music(self): if len(self.music_queue) > 0: self.is_playing = True m_url = self.music_queue[0][0]['source'] # try to connect to voice channel if you are not already connected if self.vc == "" or not self.vc.is_connected() or self.vc == None: self.vc = await self.music_queue[0][1].channel.connect() else: await self.vc.move_to(self.music_queue[0][1]) print(self.music_queue) # remove the first element as you are currently playing it self.music_queue.pop(0) self.vc.play(discord.FFmpegPCMAudio(m_url, **self.FFMPEG_OPTIONS), after=lambda e: self.play_next()) else: self.is_playing = False @commands.command(name="play", help="Plays a selected song from youtube") async def p(self, ctx, *args): query = " ".join(args) voice_channel = ctx.author.voice if voice_channel is None: # you need to be connected so that the bot knows where to go await ctx.send("Connect to a voice channel!") else: song = self.search_yt(query) if type(song) == type(True): await ctx.send( "Could not download the song. Incorrect format try another keyword. This could be due to playlist or a livestream format.") else: await ctx.send("Song added to the queue") self.music_queue.append([song, voice_channel]) if self.is_playing == False: await self.play_music() @commands.command(name="queue", help="Displays the current songs in queue") async def q(self, ctx): retval = "" for i in range(0, len(self.music_queue)): retval += self.music_queue[i][0]['title'] + "\n" print(retval) if retval != "": await ctx.send(retval) else: await ctx.send("No music in queue") @commands.command(name="skip", help="Skips the current song being played") async def skip(self, ctx): if self.vc != "" and self.vc: self.vc.stop() await ctx.send("Stopped!") # try to play next in the queue if it exists await self.play_music() await ctx.send("Skipped!") def setup(bot): bot.add_cog(music_cog(bot))

我还检查了 FFMPEG 及其路径,尝试了不同的代码和方法,但即使它们有效,也没有声音。我也安装了 discord.py[voice]。

我已经很感激帮助了,谢谢。

1 个答案:

答案 0 :(得分:0)

我在 19 小时后发现了意图

intents = discord.Intents(messages=True, guilds=True, reactions=True, members=True, presences=True)

阻止机器人连接到 voice_channel 服务器,即使它看起来像是在 Voice Channel 中。

删除它解决了我的问题。