能否通过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模块正常运行。
验证流程
- 启动NGINX服务器
- 运行你的Discord Bot,让它加入目标语音频道
- 打开Twitch直播后台,就能看到推流过来的音频了
额外小提示
- 如果你不需要NGINX中转,也可以直接用FFmpeg把音频推到Twitch,只需要把代码里的FFmpeg输出地址改成
rtmp://live.twitch.tv/app/YOUR_TWITCH_STREAM_KEY就行。 - 注意音频编码参数,Twitch推荐AAC编码,比特率建议在128kbps-256kbps之间,根据你的需求调整。
- 推流时确保网络稳定,避免丢包影响直播效果。
内容的提问来源于stack exchange,提问作者DigitalDisaster




