调用ytdl-core给Discord机器人推流时无音频输出且无报错如何解决
问题根因
上述代码存在4个核心问题导致无音频输出也无报错:
- 未指定ytdl仅拉取音频流,混合流无法被Discord语音模块正确解析
- 错误使用
StreamType.Arbitrary作为输入类型,跳过了必要的音频封装解析步骤 - 未添加任何错误监听逻辑,底层报错被静默吞噬
- Idle事件逻辑未做状态校验,流还未完成加载就触发了连接销毁
修复方案
分步调整说明
- 给ytdl添加参数,仅拉取最高质量的纯音频流,同时设置足够大的缓冲阈值避免流提前中断
- 将输入流类型替换为
StreamType.WebmOpus,适配YouTube默认的opus编码webm音频流格式 - 补充流和播放器的错误监听逻辑,方便后续定位问题
- 调整Idle事件逻辑,确认流完全播放结束后再销毁语音连接
修复后完整代码
const stream = ytdl('https://www.youtube.com/watch?v=bPjZmQAvk_8', { filter: 'audioonly', quality: 'highestaudio', highWaterMark: 1 << 25 }); const resource = createAudioResource(stream, { inputType: StreamType.WebmOpus }); const player = createAudioPlayer(); // 错误监听逻辑 stream.on('error', err => console.error('音频流加载失败:', err)); player.on('error', err => console.error('音频播放器运行错误:', err)); player.play(resource); connection.subscribe(player); player.on(AudioPlayerStatus.Idle, () => { if (stream.readableEnded) { connection.destroy(); } });
内容的提问来源于stack exchange,提问作者jhbran
相关产品推荐
相关产品推荐

