【问题标题】:discord.py - Command raised an exception: OpusNotLoadeddiscord.py - 命令引发异常:OpusNotLoaded
【发布时间】:2019-09-19 01:20:20
【问题描述】:

我正在制作一个音乐机器人,但我遇到了这个问题,我正在运行 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:

【问题讨论】:

    标签: python discord.py


    【解决方案1】:

    尝试使用以下方式加载 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')
    

    因此,您可以确定如果没有正确加载并且立即知道在哪里查找,则会引发异常。如果加载时发生异常,它仍然会传播。

    【讨论】:

    • 我应该在代码的什么地方添加这些?我对此有点陌生,抱歉
    • “在你尝试做任何与语音通道相关的事情之前的任何地方”它可能在你初始化机器人的第一行中的某个地方。另外,创建你自己的 discord bot 很有趣,但不幸的是,这不是学习 Python 的最佳方式,我建议你也遵循更多的基础教程。
    • TypeError: load_opus() 缺少 1 个必需的位置参数:'name' 名称应该是什么?
    • 从我在网上看到的情况来看,它应该可以在没有参数的情况下工作。 name='opus' 有效吗?
    • 似乎您的问题无法解决,因为您使用的是heroku:stackoverflow.com/questions/49806427/…
    【解决方案2】:

    您无需在代码中添加任何内容,请尝试将其添加到 Heroku 上的构建包中:

    https://github.com/xrisk/heroku-opus.git
    

    【讨论】:

      【解决方案3】:

      我是 Mac 用户(不使用 Heroku),我也遇到了同样的错误。我尝试了以下方法: discord.opus.load_opus() 导致必需的参数错误。 discord.opus.load_opus('opus') 导致另一个错误。

      为我解决错误的唯一方法是:

      » 打开 Mac 终端

      » 在终端brew install opus中写入如下代码并回车。

      » 打开您为机器人编写代码的 IDE。

      » 尝试在代码开头或音乐命令上方输入此内容discord.opus.load_opus()

      » 不和谐地运行你的机器人。

      现在您不会收到任何错误,机器人将在语音通道中播放音乐。

      【讨论】:

        猜你喜欢
        • 2018-12-09
        • 2022-01-02
        • 1970-01-01
        • 2021-05-02
        • 2021-07-17
        • 2021-10-07
        • 1970-01-01
        • 2019-12-08
        • 2022-01-16
        相关资源
        最近更新 更多