【问题标题】:How to play music from a local file如何从本地文件播放音乐
【发布时间】:2019-02-02 01:53:11
【问题描述】:

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

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

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

【问题讨论】:

标签: c# .net discord discord.net


【解决方案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 类来完成所有这些操作,而不是使用负责执行命令的模块。

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

Module & Service

希望对你有所帮助。

【讨论】:

  • PS:同样的代码可用于播放来自其他来源的音频,而不仅仅是本地文件,因此通过将音频源 URL 传递给 ffmpeg 进程,您将获得音频播放。这是一个示例 URL:radio.truckers.fm,这是一个直接的音频流源,所以 ffmpeg 吃掉它没有问题。但是它不适用于 youtube 视频,还有一个额外的步骤可以实现。
  • 太棒了。尽管我设法使用了第一种方法并且最终奏效了,但我也尝试了第二种方法。问题一:program.cs中需要.AddSingleton(AudioService)吗?我也感谢你的努力,并愿意透露一切:)
  • 理想情况下是的,您希望使用.AddSingleton&lt;AudioService&gt;()AudioService 注入AudioModule。另外我忘了提到另一件事,您需要将ffmpeg.exe 复制到项目的输出中,我将编辑我的答案以包含它。
猜你喜欢
  • 1970-01-01
  • 2021-07-07
  • 2021-12-05
  • 2017-09-13
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多