首页 > 解决方案 > 如何从本地文件播放音乐

问题描述

经过长时间的运行和试用,我设法将我的机器人连接到语音通道并断开连接。但是我找不到播放音乐的正确方法。我研究并尝试阅读并遇到了许多不同的选项,例如,ffmpeg但我不知道如何使用它们。sharplinklavalink

关于如何将音频文件播放到频道中有一个确切的问题?但它参考 JavaScript 而不是 .NET,所以我无处可去。

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

标签: c#.netdiscorddiscord.net

解决方案


你缺少的是音频流本身,我会给你一个使用的例子,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类来完成所有这些工作,而不是负责执行命令的模块。

这是一个带有专用服务的模块示例,上面的代码是从这里复制而来的:

模块服务

希望这对您有所帮助。


推荐阅读