Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何播放本地文件中的音乐_C#_.net_Discord_Discord.net - Fatal编程技术网

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
复制到项目的输出中,我将编辑我的答案以将其包括在内。