C# 如何播放本地文件中的音乐
经过长时间的运行和试用,我成功地将我的机器人连接到一个语音频道,并与一个语音频道断开连接。然而,我找不到一个合适的方式来演奏音乐。我研究并尝试阅读,发现了许多不同的选项,如C# 如何播放本地文件中的音乐,c#,.net,discord,discord.net,C#,.net,Discord,Discord.net,经过长时间的运行和试用,我成功地将我的机器人连接到一个语音频道,并与一个语音频道断开连接。然而,我找不到一个合适的方式来演奏音乐。我研究并尝试阅读,发现了许多不同的选项,如ffmpeg、sharplink和lavalink,但我不知道如何使用它们 关于这一点有一个确切的问题,但它使用的是JavaScript,而不是.NET,所以我什么都不知道 因此,如何在成功连接后在语音通道中播放来自我的机器人的音频(本地文件)。 版本:Discord.Net 2.x nightly您缺少的是音频流本身,我将使
ffmpeg
、sharplink
和lavalink
,但我不知道如何使用它们
关于这一点有一个确切的问题,但它使用的是JavaScript,而不是.NET,所以我什么都不知道
因此,如何在成功连接后在语音通道中播放来自我的机器人的音频(本地文件)。
版本:Discord.Net 2.x nightly您缺少的是音频流本身,我将使用
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
});
}
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");
}
}
注意:ffmpeg.exe
应位于项目的根目录中,否则只需在FileName=”“
参数中指定不同的路由即可
编辑:您还需要指定在生成项目后将其复制到输出文件夹中。将这些行添加到.csproj
文件中应该可以做到:
<ItemGroup>
<None Update="ffmpeg.exe">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
其中client.CreatePCMStream(AudioApplication.Music)
是您的bot连接到的IAudioClient
理想情况下,您可以使用某种类型的AudioService
类来完成所有这一切,而不是使用负责执行命令的模块
下面是一个带有专用服务的模块示例,上面的代码是从其中复制的:
&
希望这对您有所帮助。Thank@linuxrocks的可能副本,但它已经过时,并且使用1.x。我每晚都在使用2.x,但它不再工作了。我已经试过了(注:同样的代码可以用于播放来自其他来源的音频,而不仅仅是本地文件,因此通过将音频源URL传递到ffmpeg过程中,您将获得音频播放。下面是一个示例URL:,这是一个直接的音频流源,所以ffmpeg没有问题。但是它不适用于youtube视频,有一个额外的步骤来实现这一点t、 好极了。虽然我成功地使用了第一种方法,并且最终成功了,但我也尝试了第二种方法。有一个问题:我是否需要在
程序中添加Singleton(AudioService)
?cs?我也感谢您的努力并愿意披露一切:)最好是,您需要使用.AddSingleton()
将音频服务
注入音频模块
。另外,我忘了提到另一件事,您需要将ffmpeg.exe
复制到项目的输出中,我将编辑我的答案以将其包括在内。