You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeError报错:source必须是AudioSource而非FFmpegOpusAudio

问题解决:disnake语音机器人报错TypeError: source must be an AudioSource not FFmpegOpusAudio

问题描述

基于disnake开发音乐机器人时,执行播放命令触发如下报错:

Traceback (most recent call last):
  File "c:\Users\Saliceterik\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\ext\commands\core.py", line 173, in wrapped
    ret = await coro(*args, **kwargs)
  File "C:\Users\Saliceterik\Desktop\snackerbot\launch_serviceTyan_s-upd.py", line 122, in play
    voice_clients[ctx.guild.id].play(player, after=lambda e: asyncio.run_coroutine_threadsafe(play_next(ctx), bot.loop))    
  File "c:\Users\Saliceterik\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\voice_client.py", line 583, in play
    raise TypeError(f"source must be an AudioSource not {source.__class__.__name__}")
TypeError: source must be an AudioSource not FFmpegOpusAudio

环境情况:

  • 已安装FFmpeg并添加至系统PATH
  • 已安装Python的ffmpeg相关库
  • 尝试过FFmpegPCMAudio等其他音频类变体,也复制过他人同功能代码,均无效

原因分析

你代码中使用的FFmpegOpusAudio来自discord库,但机器人基于disnake框架开发——disnake的VoiceClient仅接受自身库定义的AudioSource子类,跨框架的音频源类不兼容,导致类型校验失败。

解决方案

将代码中导入的音频类替换为disnake提供的对应类:

  1. 修正导入语句:
    把
from discord import FFmpegOpusAudio

替换为

from disnake import FFmpegOpusAudio
  1. 修正后的完整play函数示例:
async def play(ctx, *, link):
    try:
        voice_client = await ctx.author.voice.channel.connect()
        voice_clients[voice_client.guild.id] = voice_client
    except Exception as e:
        print(e)
    if youtube_base_url not in link:
        query_string = urllib.parse.urlencode({
            'search_query': link
        })

        content = urllib.request.urlopen(
            youtube_results_url + query_string
        )

        search_results = re.findall(r'/watch\?v=(.{11})', content.read().decode())

        link = youtube_watch_url + search_results[0]

    loop = asyncio.get_event_loop()
    data = await loop.run_in_executor(None, lambda: ytdl.extract_info(link, download=False))

    song = data['url']
    # 使用disnake库的FFmpegOpusAudio
    player = disnake.FFmpegOpusAudio(song, **ffmpeg_options)

    voice_clients[ctx.guild.id].play(player, after=lambda e: asyncio.run_coroutine_threadsafe(play_next(ctx), bot.loop))

额外说明

如果使用FFmpegPCMAudio,同样要替换为disnake.FFmpegPCMAudio。确保所有音频源类都来自disnake库,避免跨框架类型不匹配问题。

内容的提问来源于stack exchange,提问作者salice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:27:22