Discord.py Зацикливание источника звука
Кто-нибудь знает, как зациклить тот же источник в 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" постоянно зацикливался. Я искал в Интернете, но все результаты были устаревшими.
2 ответа
Вот способ узнать, когда песня закончилась.
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)
Используя лямбда-функцию, вы можете реализовать структуру цикла для воспроизведения песни после ее завершения.
Вот решение, которое я сейчас использую для себя:
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.
Если звук начинает ускоряться в начале, просто поставьте
await asyncio.sleep(0.5)
между источником и voice_client.play.
Чтобы запустить его в первую очередь, просто замените свой код следующим образом:
@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.')