Discord.py 循环播放音频源
Posted
技术标签:
【中文标题】Discord.py 循环播放音频源【英文标题】:Discord.py Looping an audio source 【发布时间】:2021-06-30 21:45:23 【问题描述】:有谁知道如何在 FFmpeg 中循环相同的源代码?
这是我的代码:
@bot.command(pass_context = True)
async def join(ctx):
if (ctx.author.voice):
channel = ctx.message.author.voice.channel
voice = await channel.connect()
source = FFmpegPCMAudio('test.mp3')
player = voice.play(source)
else:
await ctx.send('You need to be in a Voice-Channel.')
我想要永久循环播放音频文件“test.mp3”。我在互联网上搜索过,但那里给出的所有结果都是过时的。
【问题讨论】:
或许你能找到答案here 【参考方案1】:这是一种了解歌曲何时播放完毕的方法。
if (ctx.author.voice):
finished = False
channel = ctx.message.author.voice.channel
voice = await channel.connect()
voice.play(discord.FFmpegPCMAudio("song.mp3"), after=lambda e: finished = True)
使用 lambda 函数,您可以实现一个循环结构,以便在完成后重播歌曲。
【讨论】:
什么是e?after=lambda e:
@Toma 这将是 lambda 函数的绑定变量/参数。我相信它应该适用于任何其他可变字母【参考方案2】:
这是我目前正在为自己使用的解决方案:
async def play_source(voice_client):
source = FFmpegPCMAudio("test.mp3")
voice_client.play(source, after=lambda e: print('Player error: %s' % e) if e else bot.loop.create_task(play_source(voice_client)))
这个解决方案只是一个基本的解决方案。源完成后,用同样的voice_client重新启动。
如果音频一开始就开始加速,那么只需在源和 voice_client.play 之间添加一个await asyncio.sleep(0.5)
。
首先要启动它,只需像这样替换您的代码:
@bot.command(pass_context = True)
async def join(ctx):
if (ctx.author.voice):
channel = ctx.message.author.voice.channel
voice = await channel.connect()
bot.loop.create_task(play_source(voice))
else:
await ctx.send('You need to be in a Voice-Channel.')
【讨论】:
以上是关于Discord.py 循环播放音频源的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Discord.py Cogs 使 Discord Bot 加入语音频道并在成员加入频道时播放音频文件