You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

能否通过discord.js将音频推流至Twitch?相关实现疑问

关于用discord.js捕获Discord音频推流到Twitch的问题解答

嘿,我来帮你逐个拆解这些问题,都是实际开发中常遇到的场景:

1. 能不能直接用discord.js把音频推流到Twitch?

答案是不行——discord.js本身是专门用来和Discord API交互的库,没有内置推流到Twitch的功能。不过别担心,你可以结合discord.js的音频捕获能力,搭配其他流媒体工具(比如FFmpeg、NGINX RTMP)来实现这个需求。

2. 用discord.js捕获的语音频道音频,能不能用来启动Twitch推流?

完全可以!discord.js(准确说是它配套的@discordjs/voice库,v13及以上版本必备)能轻松捕获语音频道里的音频流。你只需要把捕获到的音频数据,转换成Twitch支持的格式和传输协议(Twitch主要用RTMP/RTMPS),就能推流上去。

3. 必须搭建本地NGINX RTMP服务器吗?

不是必须,但非常推荐。

  • 如果你只是简单推流,用FFmpeg直接把捕获的音频推到Twitch的RTMP地址也能行,但灵活性差,没法做混音、多流转发、编码参数调整等操作。
  • 搭建NGINX RTMP服务器的好处是:它可以作为中转节点,你先把音频流推到本地NGINX,再由NGINX转发到Twitch。这样你可以在NGINX层做很多处理,比如添加背景音、调整比特率,甚至同时推流到多个平台,后期扩展也方便。

4. 搭建好NGINX RTMP后,怎么把音频流发过去?

这里分两步:先捕获Discord音频,再把音频流推送到NGINX。

第一步:用discord.js捕获语音音频

首先确保你安装了必要的依赖:

npm install discord.js @discordjs/voice @discordjs/opus prism-media

然后写一段捕获音频并推送到NGINX的代码:

const { Client, GatewayIntentBits } = require('discord.js');
const { joinVoiceChannel, createAudioPlayer, createAudioResource, StreamType } = require('@discordjs/voice');
const { spawn } = require('child_process');

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildVoiceStates
  ]
});

client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
  // 替换成你要捕获的语音频道ID
  const voiceChannel = client.channels.cache.get('YOUR_VOICE_CHANNEL_ID');
  const connection = joinVoiceChannel({
    channelId: voiceChannel.id,
    guildId: voiceChannel.guild.id,
    adapterCreator: voiceChannel.guild.voiceAdapterCreator,
  });

  // 创建音频播放器,订阅频道音频
  const player = createAudioPlayer();
  connection.subscribe(player);

  // 启动FFmpeg进程,转码并推送到本地NGINX
  const ffmpegProcess = spawn('ffmpeg', [
    '-i', '-', // 从标准输入读取音频
    '-acodec', 'aac', // 转成Twitch支持的AAC编码
    '-ar', '44100', // 采样率匹配Twitch要求
    '-b:a', '128k', // 音频比特率
    '-f', 'flv', // 输出FLV格式(RTMP标准格式)
    'rtmp://localhost/live/twitch_stream' // NGINX的RTMP接收端点
  ]);

  // 将Discord音频流导入FFmpeg
  const resource = createAudioResource(ffmpegProcess.stdin, { inputType: StreamType.Raw });
  player.play(resource);

  // 打印FFmpeg日志方便调试
  ffmpegProcess.stderr.on('data', (data) => console.error(`FFmpeg: ${data.toString()}`));
});

client.login('YOUR_DISCORD_BOT_TOKEN');

第二步:配置NGINX RTMP服务器

修改你的NGINX配置文件(比如/etc/nginx/nginx.conf),添加RTMP模块配置:

rtmp {
    server {
        listen 1935; # RTMP默认端口
        chunk_size 4096;

        application live {
            live on;
            record off;

            # 转发到Twitch的RTMP服务器,替换成你的推流密钥
            push rtmp://live.twitch.tv/app/YOUR_TWITCH_STREAM_KEY;
        }
    }
}

配置完成后重启NGINX服务,确保RTMP模块正常运行。

验证流程

  1. 启动NGINX服务器
  2. 运行你的Discord Bot,让它加入目标语音频道
  3. 打开Twitch直播后台,就能看到推流过来的音频了

额外小提示

  • 如果你不需要NGINX中转,也可以直接用FFmpeg把音频推到Twitch,只需要把代码里的FFmpeg输出地址改成rtmp://live.twitch.tv/app/YOUR_TWITCH_STREAM_KEY就行。
  • 注意音频编码参数,Twitch推荐AAC编码,比特率建议在128kbps-256kbps之间,根据你的需求调整。
  • 推流时确保网络稳定,避免丢包影响直播效果。

内容的提问来源于stack exchange,提问作者DigitalDisaster

火山引擎 最新活动