ytdl-core与play-dl播放中途中断问题求助(AudioPlayerError: aborted)
解决ytdl-core/play-dl播放音频中途暂停并抛出
AudioPlayerError: aborted的问题 问题描述
使用ytdl-core或play-dl获取音频流,通过discord.js的createAudioResource播放时,中途会突然暂停并抛出错误AudioPlayerError: aborted。但直接将流下载到文件能快速完成,说明问题出在实时播放的缓存环节。
相关代码片段:
- ytdl初始化流:
const stream = ytdl(this.queue[guildID][0].url)
- play-dl初始化流:
const play_stream = await play.stream(this.queue[guildID][0].url, { discordPlayerCompatibility: true, })
- 创建音频资源(两种流均出现问题):
const resource = createAudioResource(play_stream.stream, { inputType: StreamType.WebmOpus });
解决方案
1. 提高流的缓存水位
给ytdl-core或play-dl的流配置更高的highWaterMark,增加缓冲区大小,避免因数据供应滞后导致播放中断:
- 针对ytdl-core:
const stream = ytdl(this.queue[guildID][0].url, { highWaterMark: 1 << 25 // 设置为32MB,可根据实际情况调整 });
- 针对play-dl:
const play_stream = await play.stream(this.queue[guildID][0].url, { discordPlayerCompatibility: true, highWaterMark: 1 << 25 });
2. 用临时文件中转音频流
既然直接下载文件无问题,可先将流写入临时文件,再从文件创建音频资源,绕过实时流的缓存限制:
const fs = require('fs'); const { createAudioResource, StreamType } = require('@discordjs/voice'); const { promisify } = require('util'); const pipeline = promisify(require('stream').pipeline); const tmp = require('tmp'); // 需先安装:npm install tmp // 生成临时文件 const tmpFile = tmp.fileSync({ postfix: '.webm' }); // 将流写入临时文件 await pipeline(play_stream.stream, fs.createWriteStream(tmpFile.name)); // 从临时文件创建可播放的资源 const resource = createAudioResource(tmpFile.name, { inputType: StreamType.WebmOpus }); // 播放结束后清理临时文件 resource.playStream.on('end', () => { tmpFile.removeCallback(); });
3. 调整音频资源的缓存配置
创建AudioResource时,调整缓冲区大小或启用内置缓存优化:
const resource = createAudioResource(play_stream.stream, { inputType: StreamType.WebmOpus, bufferSize: 4096 * 8 // 增大帧缓存数量 });
4. 更新依赖到最新版本
旧版本的ytdl-core、play-dl或@discordjs/voice可能存在流兼容Bug,更新到最新版本尝试解决:
npm update ytdl-core play-dl @discordjs/voice
内容的提问来源于stack exchange,提问作者BlackInk7777
相关产品推荐
相关产品推荐

