如何从本地文件播放音乐

时间:2018-08-27 13:43:50

标签: c# .net discord discord.net

经过长时间的尝试,我设法将我的漫游器连接到语音通道,并且也断开了与之的连接。但是我找不到合适的播放音乐的方法。我研究并尝试阅读并遇到了let action1 = () => { // ... }; let action2 = () => { // ... }; let action3 = () => { // ... }; ffmpegsharplink之类的许多不同选项,但我不知道如何使用它们。

关于SO How to Play Audio File Into Channel?,有一个确切的问题,但是它是用JavaScript而不是.NET引用的,所以我无处可寻。

因此,成功连接后如何在语音通道中播放我的机器人的音频(本地文件)。 版本:每晚Discord.Net 2.x

1 个答案:

答案 0 :(得分:1)

您所缺少的是音频流本身,我将使用ffmpeg为您提供示例,因为这是我所使用的并且有效。

完全公开,我要提供样品的项目是我自己的。

对,所以您已经完成了语音通道的连接/断开操作,很好的工作! 现在,您所缺少的只是流一些音频(如您的问题所指示的那样从本地文件)。

您需要做的是使用以下方法为ffmpeg启动一个单独的过程:

private Process CreateStream(string filePath)
{
    return Process.Start(new ProcessStartInfo
    {
        FileName = "ffmpeg.exe",
        Arguments = $"-hide_banner -loglevel panic -i \"{filePath}\" -ac 2 -f s16le -ar 48000 pipe:1",
        UseShellExecute = false,
        RedirectStandardOutput = true
    });
}

注意:ffmpeg.exe应该位于项目的根目录中,否则,只需在FileName = ""参数中指定其他路由即可。

编辑:创建项目后,还需要指定将其复制到输出文件夹中。将这些行添加到您的.csproj文件中即可达到目的:

<ItemGroup>
    <None Update="ffmpeg.exe">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
</ItemGroup>

要将音频发送到您所连接的语音通道,请使用类似以下的内容:

using (Stream output = CreateStream(filePath).StandardOutput.BaseStream)
using (AudioOutStream stream = client.CreatePCMStream(AudioApplication.Music))
{
    try
    {
        await output.CopyToAsync(stream);
    }
    catch (Exception e)
    {
         _logger.LogError(e, "Stopped audio stream");
    }
}

您的机器人已连接到client.CreatePCMStream(AudioApplication.Music)的地方IAudioClient

理想情况下,您将拥有某种类型的AudioService类来完成所有这些工作,而不是由负责执行命令的模块来完成。

这是带有专用服务的模块的示例,复制了上面的代码:

ModuleService

希望这对您有所帮助。