Discord.js V14语音功能Windows正常,Ubuntu服务器无声音问题求助
解决Discord.js V14在Ubuntu服务器语音无输出问题
问题描述
Discord.js V14的语音功能在Windows系统可正常运行,但部署到Ubuntu服务器后,机器人能成功加入语音频道,却无声音输出。已确认双平台依赖均安装,问题锁定在FFmpeg播放环节,尝试过opus库仍未解决。
Ubuntu服务器依赖报告
Core Dependencies
- @discordjs/voice: 0.16.1
- prism-media: 1.3.5
Opus Libraries- @discordjs/opus: 0.9.0
- opusscript: not found
Encryption Libraries- sodium-native: 4.0.4
- sodium: not found
- libsodium-wrappers: 0.7.13
- tweetnacl: not found
FFmpeg- version: 6.0-static
- libopus: yes
运行代码(无报错输出)
const fs = require("fs"); const { SlashCommandBuilder } = require("@discordjs/builders"); const { AudioPlayerStatus, createAudioPlayer, createAudioResource, joinVoiceChannel, StreamType, } = require("@discordjs/voice"); module.exports = { data: new SlashCommandBuilder() .setName("play") .setDescription("播放歌曲") .addAttachmentOption((option) => option .setName("song") .setDescription("要播放的歌曲") .setRequired(true) ), async execute(interaction) { await interaction.reply({ content: "准备歌曲中...", ephemeral: true }); const attachment = interaction.options.getAttachment("song"); const channel = interaction.member.voice.channel; if (!channel) return await interaction.editReply({ content: "请先加入语音频道!", ephemeral: true, }); const connection = joinVoiceChannel({ channelId: channel.id, guildId: channel.guild.id, adapterCreator: channel.guild.voiceAdapterCreator, }); const player = createAudioPlayer(); console.log(attachment.url); const resource = createAudioResource(attachment.url, { inputType: StreamType.Opus, }); player.play(resource); connection.subscribe(player); await interaction.editReply({ content: `正在播放 ${attachment.name}!`, ephemeral: true, }); await new Promise((resolve) => setTimeout(resolve, 2000)); player.on(AudioPlayerStatus.Idle, () => { console.log("destroy"); connection.destroy(); }); }, };
排查与解决方案
1. 验证FFmpeg编码支持
依赖报告显示FFmpeg为静态版本,但Ubuntu环境下可能存在编码缺失。执行命令检查opus编码支持:
ffmpeg -encoders | grep opus
若未输出libopus,则替换为系统包管理的FFmpeg:
sudo apt update && sudo apt install ffmpeg
2. 调整音频资源输入类型
代码中指定inputType: StreamType.Opus,但上传附件可能并非opus编码。尝试移除该参数让系统自动检测:
const resource = createAudioResource(attachment.url);
或根据实际音频格式指定类型(如MP3用StreamType.Arbitrary):
const resource = createAudioResource(attachment.url, { inputType: StreamType.Arbitrary, });
3. 配置服务器音频设备
Ubuntu服务器可能无音频输出设备,安装虚拟音频设备:
sudo apt install pulseaudio sudo systemctl start pulseaudio
确保机器人进程有权限访问音频设备。
4. 修复sodium库兼容性
安装系统级libsodium依赖后重新安装项目依赖:
sudo apt install libsodium-dev npm uninstall sodium-native && npm install sodium-native
5. 添加错误监听排查问题
在代码中添加播放器错误监听,定位具体问题:
player.on('error', error => { console.error(`音频播放错误: ${error.message}`); console.error(error.stack); });
内容的提问来源于stack exchange,提问作者Wosca
相关产品推荐
相关产品推荐

