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提供的对应类:
- 修正导入语句:
把
from discord import FFmpegOpusAudio
替换为
from disnake import FFmpegOpusAudio
- 修正后的完整
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
相关产品推荐
相关产品推荐

