【问题标题】:Stream an audio file from Google Drive into a Discord voice channel将音频文件从 Google Drive 流式传输到 Discord 语音频道
【发布时间】:2019-12-22 19:47:30
【问题描述】:

所以我正在尝试设置一个音乐库,我可以从我的 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() 函数并在.get() 之后立即只留下.pipe(temp),但我得到了同样的错误:

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

为了澄清,我已经知道如何让机器人加入 Discord 语音频道并让它播放音频文件,我只需要知道如何从 Google Drive 获取我需要的文件,如果可能的话,队列/播放列表系统的最佳方法是什么。

欢迎任何建议,在此先感谢。

【问题讨论】:

    标签: node.js google-drive-api discord.js audio-streaming


    【解决方案1】:
    • 您想在 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() 退出。

    参考资料:

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

    【讨论】:

    • 将您的答案标记为正确,效果很好。
    • @Endyxion 感谢您的回复。很高兴您的问题得到解决。
    猜你喜欢
    • 2013-08-11
    • 2020-02-19
    • 2016-01-26
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多