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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:25:13