#python #ffmpeg #bots #discord.py #youtube-dl
#python #ffmpeg #боты #discord.py #youtube-dl
Вопрос:
Я пытаюсь создать музыкального бота discord. Я использую youtube-dl для извлечения информации и ffmpeg для воспроизведения звука. Мой бот может успешно ставить в очередь и воспроизводить обычные видео, но когда дело доходит до воспроизведения всего списка воспроизведения, он не работает.
Это мой код для воспроизведения плейлистов:
if 'entries' in info:
for i in info['entries']:
URL = i['formats'][0]['url']
player = FFmpegPCMAudio(URL, **FFMPEG_OPTIONS)
queue.append(player)
source = queue.pop(0)
voice.play(player, after = lambda e: play_next(ctx, source))
await ctx.send('playing song')
При этом загружаются все видео в плейлисте, но воспроизводится только первое, а затем отображается эта ошибка:
discord.errors.ClientException: Already playing audio.
Ответ №1:
вы можете проверить, воспроизводит ли голос аудио или нет, и делать что-то на основе этого значения,
if voice is None:
voice.play(player, after = lambda e: play_next(ctx, source))
else:
print("Audio is playing!")
но, выполнив команду «voice is None», это означает, что он не только проверит, воспроизводится ли звук, но и проверит все, что нужно делать с голосом, но хорошая вещь при этом заключается в том, что вы можете проверить, находится ли бот все еще в голосовом канале или нет, прежде чем должна начаться следующая песня, иприсоединяйтесь к каналу снова, если у бота была некоторая задержка между воспроизведением песен и оставленной причиной бездействия,
voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
if voice is_playing(): <--- something like this but that works!
voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
if voice is None:
voiceChannel = discord.utils.get(ctx.guild.voice_channels, name=ctx.author.voice.channel.name)
await voiceChannel.connect()
voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
voice.play(player, after = lambda e: play_next(ctx, source))
else:
voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
voice.play(player, after = lambda e: play_next(ctx, source))
этот последний пример может быть немного незавершенным, но он должен быть очень близок к работе, если вы сможете заставить работать ту часть, на которую указывает моя стрелка, но, насколько я знаю, это хорошее решение, надеюсь, это помогло, я знаю, что я очень опаздываю с этим :).
Ответ №2:
Проблема заключается именно в том, о чем сообщает вам сообщение об ошибке: вы пытались воспроизвести файл, в то время как один из них уже воспроизводился. Вам нужно подождать, пока звук не будет воспроизведен; ваша единственная задержка — это приостановка до завершения загрузки.
Вам нужно либо посмотреть, как выполнить блокирующий вызов play
(вне области видимости для переполнения стека), либо проверить время воспроизведения из метаданных файла, и sleep
это долго.
Это заставляет вас двигаться?
Комментарии:
1. Понятно, думаю, я попробую это сделать. Большое спасибо!