将音频文件从Google云端硬盘传输到Discord语音通道中

问题描述 投票:2回答:1

因此,我试图建立一个音乐库,我可以从discord.js机器人中访问它。理想情况下,我希望流式播放播放列表/特定歌曲,来自同一流派的所有歌曲都将位于同一文件夹中,所以我的想法是说!play electronic,并且该漫游器将播放特定文件夹中的所有文件。在进入整个文件夹之前,我一直在尝试流式传输单个文件,而这就是我要坚持的地方。我还没有找到一种方法来流式传输音频文件本身,但是我想下载它并将其存储在一个临时mp3文件中。我会接受有关如何流式传输文件(而不是下载文件)的任何类型的建议(如果这样做有很大的好处/很容易编写代码),否则将如何下载文件并在播放时临时存储文件(请记住托管服务)我正在使用的存储空间有限,因此不能选择下载整个文件夹),以及如何以一种有效的方式让机器人进行加载/预加载和播放列表(整个音乐文件夹)的排队流。这是我的代码的相关部分,在Google Drive API docs about file downloads之后:

if (message.member.voiceChannel) {
    var temp = fs.createWriteStream('./tmpsong.mp3');
    drive.files.get({
        fileId: '1JTJ7W9C6NBBtjcLhD6P4G9YeXvPQxaBP',
        alt: 'media'
    }).on('end', function () {
        console.log('Done');
    }).on('error', function (err) {
        console.log('Error during download', err);
    }).pipe(temp).then(() => {
        message.member.voiceChannel.join().then(connection => {
            const dispatcher = connection.playFile('./tmpsong.mp3');
            dispatcher.on("end", end => { message.member.voiceChannel.leave(); });
        });
    }).catch(err => console.log(err));
}

这是我得到的错误:

An error occurred while running the command: TypeError: drive.files.get(...).on is not a function.

我尝试删除两个.on()函数,并且仅在.pipe(temp)之后仅保留.get(),但出现了相同的错误:

An error occurred while running the command: TypeError: drive.files.get(...).pipe is not a function.

为澄清起见,我已经知道如何使漫游器加入Discord语音通道并使其播放音频文件,我只需要知道如何从Google云端硬盘中获取所需的文件,如果可能的话,该怎么办?对于队列/播放列表系统来说,这是最好的方法。

欢迎您提出任何建议,谢谢。

node.js google-drive-api discord.js audio-streaming
1个回答
0
投票
  • 您想在Discord的语音通道上播放MP3文件。
  • 您已经能够在语音通道上播放MP3文件。
  • 您已经可以使用Drive API。
  • 您想了解下载MP3文件并使用下载的文件播放它的方法。

如果我的理解是正确的,那么这个答案怎么样?请认为这只是几个可能的答案之一。

修改点:

  • 在脚本中,下载MP3文件并将其另存为临时文件,然后尝试使用该临时文件播放MP3文件。
    • 在这种情况下,我认为无需使用流创建临时文件就可以播放MP3文件。

修改的脚本:

修改脚本后,将如下所示。

if (message.member.voiceChannel) {
  drive.files.get(
    {
      fileId: '1JTJ7W9C6NBBtjcLhD6P4G9YeXvPQxaBP',
      alt: "media"
    },
    { responseType: "stream" },
    (err, { data }) => {
      message.member.voiceChannel
        .join()
        .then(connection => {
          const dispatcher = connection.playStream(data);
          dispatcher.on("end", end => {
            message.member.voiceChannel.leave();
            process.exit();
          });
        })
        .catch(err => console.log(err));
    }
  );
}
  • 在这种情况下,当MP3的播放结束时,脚本会由process.exit()退出。

参考:

如果我误解了你的问题,而这不是你想要的方向,我深表歉意。

© www.soinside.com 2019 - 2024. All rights reserved.