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.')
Другие вопросы по тегам