通过语音通道播放音频的问题;音频被截断,每个文件逐渐延迟

时间:2019-08-29 22:47:08

标签: node.js discord.js

最终目标:我正在创建一个为Final Fantasy XIV袭击而打造的不和谐机器人。您只需在拉动老板时告诉机器人,机器人就会遵循预先定义的时间线,该时间线会在机器人发生前不久向所有人发出警告。简而言之:它会在收到!start命令后的预定义时间播放音频文件的预定义列表。

好消息是音频正在播放。

坏消息很复杂。

有两个问题,我感到它们之间存在关联。第一个问题是,无论我播放什么音频文件,最后一点(大约0.5s)都会被切断。我给了它一个音频文件,上面写着“ Tank buster s-”,然后播放了出来。到目前为止,我一直在通过在每个声音文件的末尾添加一秒钟的静音来解决此问题。一直在工作。当然,它仍然被截断了,只是它在截断了沉默。

第二个问题是,在播放一个音频文件之后,下一个音频文件在机器人尝试开始播放它与实际输出音频之间存在短暂的延迟。 (不和谐的是,我可以看到它是机器人在开始播放音频之前很​​短的时间内提示他们的“麦克风”。)此延迟随着播放的每个文件而逐渐恶化,到实际上延迟了几秒钟的地步。 (当延迟足够严重时,我会看到机器人提示了大约一秒钟,没有提示,然后在延迟最终结束时重新提示)

完成大部分工作的代码如下:

//timeline() is called once per second by a setInterval() object, while the fight is active.
function timeline()
{
    tick++;

    var len = callouts.length;
    for (var i = 0; i < len; i++)
    {
        if (tick == callouts[i]["time"])
        {
            dispatcher[dispatcherIndex] = voiceConnection.playFile(callouts[i]["file"]);
            dispatcherIndex++;
            activeChannel.send(callouts[i]["message"]);                 
        }
    }
} //end timeline()

Discord.js文档提到它更喜欢使用节点操作来实现语音功能,但是该操作也将起作用。我似乎无法安装前者,所以我正在使用后者。

编辑:我现在已经找到了解决方法。当Bot离开并重新加入声音时,渐进式延迟将被“重置”,因此我只在完成播放音频文件时才这样做。严格来说,它是可行的,但如果可能的话,我仍然希望有一个“适当的”解决方案。

1 个答案:

答案 0 :(得分:0)

安装git(为什么 heck 为什么我早就没有安装git?)最终被证明是正确的催化剂。如前所述,让我安装discord.js master分支,该分支可以更好地处理语音。经过几次与ffmpeg相关的打ic之后,我现在使该机器人可以无延迟地播放完整的音频文件,而无需任何解决方法。现在一切都很好!