如何从本地文件播放音乐
How to play music from a local file
经过长时间的 运行 和试用,我设法将我的机器人连接到一个语音通道,并也断开了与一个语音通道的连接。但是我找不到播放音乐的正确方法。我研究并尝试阅读并遇到了许多不同的选项,例如 ffmpeg
、sharplink
和 lavalink
,但我不知道如何使用它们。
关于 SO 有一个确切的问题,但它涉及 JavaScript 而不是 .NET,所以我无处可去。
那么,如何在成功连接后在语音通道中播放来自我的机器人的音频(本地文件)。
版本 : Discord.Net 2.x 每晚
您缺少的是音频流本身,我将使用 ffmpeg
给您举个例子,因为这就是我使用的并且它有效。
完全公开,我要提供样本的项目是我自己的。
好的,您已经完成了语音通道 connect/disconnect 的工作,干得好!
现在您所缺少的只是流式传输一些音频(如您的问题所示,来自本地文件)。
您需要为 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
class 来完成所有这些工作,而不是负责执行命令的模块。
这是一个带有专用服务的模块示例,上面的代码是从那里复制的:
希望对您有所帮助。
经过长时间的 运行 和试用,我设法将我的机器人连接到一个语音通道,并也断开了与一个语音通道的连接。但是我找不到播放音乐的正确方法。我研究并尝试阅读并遇到了许多不同的选项,例如 ffmpeg
、sharplink
和 lavalink
,但我不知道如何使用它们。
关于 SO
那么,如何在成功连接后在语音通道中播放来自我的机器人的音频(本地文件)。 版本 : Discord.Net 2.x 每晚
您缺少的是音频流本身,我将使用 ffmpeg
给您举个例子,因为这就是我使用的并且它有效。
完全公开,我要提供样本的项目是我自己的。
好的,您已经完成了语音通道 connect/disconnect 的工作,干得好! 现在您所缺少的只是流式传输一些音频(如您的问题所示,来自本地文件)。
您需要为 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
class 来完成所有这些工作,而不是负责执行命令的模块。
这是一个带有专用服务的模块示例,上面的代码是从那里复制的:
希望对您有所帮助。