Discord.js v13中createStream()方法的等价实现方式是什么
Discord.js v13 实现语音接收与本地存储方案
Discord.js v13 对语音模块做了架构拆分,原主包内置的语音能力被独立为@discordjs/voice包,v12版本的connection.receiver.createStream()方法被移除,对应功能通过订阅用户音频轨道的方式实现,输出的音频格式和v12完全一致,为16位小端序(s16le)48kHz 双声道PCM原始流。
前置准备
首先安装独立的语音依赖包:
npm install @discordjs/voice
fs为Node.js内置模块,无需额外安装。
实现代码
确保机器人已经成功加入目标语音频道、拿到有效语音连接后,即可通过以下代码录制指定用户的音频并存到本地:
const fs = require('fs'); const { getVoiceConnection, EndBehaviorType } = require('@discordjs/voice'); // 传入对应 guild(服务器)ID,获取当前已建立的语音连接 const voiceConnection = getVoiceConnection('你的目标服务器ID'); // 填入要录制的目标用户ID const recordUserId = '待录制用户的ID'; // 获取语音接收器,订阅目标用户的音频轨道 const receiver = voiceConnection.receiver; const audioSubscription = receiver.subscribe(recordUserId, { end: { // 配置静音判定规则:用户静音超过100毫秒则标记当前音频段结束 behavior: EndBehaviorType.AfterSilence, duration: 100 } }); // 订阅成功后即可拿到音频可读流,直接管道写入本地文件 if (audioSubscription) { const pcmReadStream = audioSubscription.stream; const fileWriteStream = fs.createWriteStream('./user_audio.pcm'); pcmReadStream.pipe(fileWriteStream); // 监听写入完成事件 fileWriteStream.on('finish', () => { console.log('音频录制完成,已保存到本地文件'); }); // 如需主动停止录制,调用unsubscribe方法即可 // 例:15秒后自动停止录制 // setTimeout(() => audioSubscription.unsubscribe(), 15000); }
注意事项
- 上述代码输出的是无封装头的原始PCM音频,无法直接用普通影音播放器打开,如需输出wav、mp3等通用格式,可以在管道中间接入ffmpeg做转码处理后再写入文件
- 机器人需要拥有目标语音频道的
连接、说话权限,否则无法正常接收音频流 - 录制用户语音前请确认已获得用户明确授权,遵守Discord平台规则与当地隐私相关法规
内容的提问来源于stack exchange,提问作者DefaultLP
相关产品推荐
相关产品推荐

