我当时正在做一个音乐机器人,但是遇到了这个问题,我正在运行python 3.6.8,并将其托管在heroku上
我听说我需要使用discord.opus.LoadOpus或类似的东西,但是我不知道如何将其添加到我的代码中以及在哪里,请提供帮助
在这里输入我的代码
import discord
import asyncio
from discord.ext import commands
client = commands.Bot(command_prefix='!')
songs = asyncio.Queue()
play_next_song = asyncio.Event()
@client.event
async def on_ready():
print('client ready')
async def audio_player_task():
while True:
play_next_song.clear()
current = await songs.get()
current.start()
await play_next_song.wait()
def toggle_next():
client.loop.call_soon_threadsafe(play_next_song.set)
@client.command(pass_context=True)
async def play(ctx, url):
if not client.is_voice_connected(ctx.message.server):
voice = await client.join_voice_channel(ctx.message.author.voice_channel)
else:
voice = client.voice_client_in(ctx.message.server)
player = await voice.create_ytdl_player(url, after=toggle_next)
await songs.put(player)
client.loop.create_task(audio_player_task())
client.run('TOKEN')
我有这个错误:
Ignoring exception in command play
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py", line 50, in wrapped
ret = yield from coro(*args, **kwargs)
File "Draco.py", line 30, in play
voice = await client.join_voice_channel(ctx.message.author.voice_channel)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/client.py", line 3209, in join_voice_channel
voice = VoiceClient(**kwargs)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/voice_client.py", line 230, in __init__
self.encoder = opus.Encoder(48000, 2)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/opus.py", line 197, in __init__
raise OpusNotLoaded()
discord.opus.OpusNotLoaded
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/bot.py", line 846, in process_commands
yield from command.invoke(ctx)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py", line 374, in invoke
yield from injected(*ctx.args, **ctx.kwargs)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/ext/commands/core.py", line 54, in wrapped
raise CommandInvokeError(e) from e
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: OpusNotLoaded:
答案 0 :(得分:3)
您不需要在代码中添加任何内容,请尝试将其添加到 Heroku 上的构建包中:
https://github.com/xrisk/heroku-opus.git
答案 1 :(得分:0)
尝试使用以下命令加载opus模块:
discord.opus.load_opus()
在尝试使用漫游器进行任何与语音通道相关的操作之前,请先在任何地方进行
。根据discord.py docs,您不需要在Windows环境中使用它,这也许就是为什么它在您的本地计算机上而不是在heroku(基于unix的)上运行的原因。
此外,我将执行以下操作:
discord.opus.load_opus()
if not discord.opus.is_loaded():
raise RunTimeError('Opus failed to load')
因此,您可以确保如果未正确加载异常并知道立即查找位置,则会引发异常。如果在加载时发生异常,它将继续传播。
答案 2 :(得分:0)
我有类似的问题。我不知道它是否对您有用,但是您可以尝试一下 (当我尝试在计算机上运行它时出现错误,但在Heroku上运行正常)。
我将此添加到了脚本中:
import ctypes
import ctypes.util
print("ctypes - Find opus:")
a = ctypes.util.find_library('opus')
print(a)
print("Discord - Load Opus:")
b = discord.opus.load_opus(a)
print(b)
print("Discord - Is loaded:")
c = discord.opus.is_loaded()
print(c)
请记住将其放在与音频相关的任何内容之前(最好的选择是将其粘贴在开头)。
Source
答案 3 :(得分:0)
我是 Mac 用户(不使用 Heroku),我也遇到了同样的错误。我尝试了以下方法:
discord.opus.load_opus()
导致必需参数错误。
discord.opus.load_opus('opus')
导致另一个错误。
为我解决错误的唯一方法是:
» 打开 Mac 终端
» 在终端 brew install opus
中编写以下代码并输入。
» 打开您为机器人编写代码的 IDE。
» 尝试在代码的开头或音乐命令上方输入此内容 discord.opus.load_opus()
» 不和谐地运行你的机器人。
现在您不会收到任何错误,机器人将在语音频道中播放音乐。