通过 opusscript 播放音频时出现 RangeError
RangeError when playing audio through opusscript
我一直在尝试使用 electron 通过 discord 机器人播放声音。但是,我遇到了三个问题。
首先是我通常用来通过 discord returns 播放声音文件的代码,一个错误表明我缺少 opus.node 和 opusscript。这不应该发生,因为我安装了@discordjs/opus,并且运行在电子实例之外使用相同的代码工作得很好。
message.member.voice.channel.join().then((connection) => {
const dispatcher = connection.play(ytdl("https://www.youtube.com/watch?v=ZlAU_w7-Xp8", { quality: "highestaudio" }));
dispatcher.on("finish", () => {
console.log("Song is finished.");
});
});
为了解决这个错误,我安装了 opusscript。但是,这是第二个问题的来源。我能够 运行 声音 - 前 9 次。第九次后,机器人发出以下错误:
(node:21064) UnhandledPromiseRejectionWarning: RangeError: offset is out of bounds
at Uint16Array.set (<anonymous>)
at OpusScript.encode (C:\Users\spiralio\Desktop\sb\node_modules\opusscript\index.js:67:16)
at Encoder._encode (C:\Users\spiralio\Desktop\sb\node_modules\prism-media\src\opus\Opus.js:60:25)
at Encoder._transform (C:\Users\spiralio\Desktop\sb\node_modules\prism-media\src\opus\Opus.js:157:30)
at Encoder.Transform._read (_stream_transform.js:191:10)
at Encoder.Transform._write (_stream_transform.js:179:12)
at doWrite (_stream_writable.js:403:12)
at writeOrBuffer (_stream_writable.js:387:5)
at Encoder.Writable.write (_stream_writable.js:318:11)
at VolumeTransformer.ondata (_stream_readable.js:716:22)
仅当我正在播放的声音文件自身重叠 9 次时才会出现此错误。如果我让它在这个错误播放之前完成,我可以继续播放声音就好了。但是,一旦播放出错,无论我等多久声音都不再播放了。
我尝试过的一个解决方案是让机器人 运行 在渲染器进程而不是主进程中。但是,这提示我机器人无法从浏览器连接到语音通道的问题。
这里似乎有一些问题。
首先,这里的根本问题是我们对一个太大的文件进行编码。我怀疑这些视频正在滚雪球,以至于我们碰壁了。
我会尝试只下载音频以避免发送过大的文件(参见 ytdl options)。
message.member.voice.channel.join().then((connection) => {
const dispatcher = connection.play(ytdl("https://www.youtube.com/watch?v=ZlAU_w7-Xp8", { quality: "highestaudio", filter: "audioonly" }));
dispatcher.on("finish", () => {
console.log("Song is finished.");
});
});
Electron 未检测到 @discordjs/opus
似乎是本机模块和您的构建器的一个更深层次的问题。您是否在生产中遇到过这种情况,或者您是否在某处重新创建了 Electron 设置?
我一直在尝试使用 electron 通过 discord 机器人播放声音。但是,我遇到了三个问题。
首先是我通常用来通过 discord returns 播放声音文件的代码,一个错误表明我缺少 opus.node 和 opusscript。这不应该发生,因为我安装了@discordjs/opus,并且运行在电子实例之外使用相同的代码工作得很好。
message.member.voice.channel.join().then((connection) => {
const dispatcher = connection.play(ytdl("https://www.youtube.com/watch?v=ZlAU_w7-Xp8", { quality: "highestaudio" }));
dispatcher.on("finish", () => {
console.log("Song is finished.");
});
});
为了解决这个错误,我安装了 opusscript。但是,这是第二个问题的来源。我能够 运行 声音 - 前 9 次。第九次后,机器人发出以下错误:
(node:21064) UnhandledPromiseRejectionWarning: RangeError: offset is out of bounds
at Uint16Array.set (<anonymous>)
at OpusScript.encode (C:\Users\spiralio\Desktop\sb\node_modules\opusscript\index.js:67:16)
at Encoder._encode (C:\Users\spiralio\Desktop\sb\node_modules\prism-media\src\opus\Opus.js:60:25)
at Encoder._transform (C:\Users\spiralio\Desktop\sb\node_modules\prism-media\src\opus\Opus.js:157:30)
at Encoder.Transform._read (_stream_transform.js:191:10)
at Encoder.Transform._write (_stream_transform.js:179:12)
at doWrite (_stream_writable.js:403:12)
at writeOrBuffer (_stream_writable.js:387:5)
at Encoder.Writable.write (_stream_writable.js:318:11)
at VolumeTransformer.ondata (_stream_readable.js:716:22)
仅当我正在播放的声音文件自身重叠 9 次时才会出现此错误。如果我让它在这个错误播放之前完成,我可以继续播放声音就好了。但是,一旦播放出错,无论我等多久声音都不再播放了。
我尝试过的一个解决方案是让机器人 运行 在渲染器进程而不是主进程中。但是,这提示我机器人无法从浏览器连接到语音通道的问题。
这里似乎有一些问题。
首先,这里的根本问题是我们对一个太大的文件进行编码。我怀疑这些视频正在滚雪球,以至于我们碰壁了。
我会尝试只下载音频以避免发送过大的文件(参见 ytdl options)。
message.member.voice.channel.join().then((connection) => {
const dispatcher = connection.play(ytdl("https://www.youtube.com/watch?v=ZlAU_w7-Xp8", { quality: "highestaudio", filter: "audioonly" }));
dispatcher.on("finish", () => {
console.log("Song is finished.");
});
});
Electron 未检测到 @discordjs/opus
似乎是本机模块和您的构建器的一个更深层次的问题。您是否在生产中遇到过这种情况,或者您是否在某处重新创建了 Electron 设置?