如何在 NET Core 中播放声音?

How to play a sound in NETCore?

我正在尝试在 .Net Core 控制台应用程序中播放声音,但我无法弄明白。

我正在寻找在 .Net Core 环境中管理的东西,可能就像常规的 .Net 一样:

// Not working on .Net Core    
System.Media.SoundPlayer player = new System.Media.SoundPlayer(@"c:\mywavfile.wav");
player.Play();

在 dotnet core Github 上发现了一个问题,他们在那里讨论它。

https://github.com/dotnet/core/issues/74

他们说音频播放没有高级 API 但这个问题已经 9 个月了,所以我希望有新的东西?

作为 .NET Core 支持音频之前的解决方法,您可以尝试这样的操作:

public static void PlaySound(string file)
{
    Process.Start(@"powershell", $@"-c (New-Object Media.SoundPlayer '{file}').PlaySync();");
}

当然,这 仅适用于安装了 PowerShell Windows 的 ,但您可以检测到您正在使用哪个 OS 并采取相应的行动。

有一种 platform-independent 方法可以做到这一点。本质上,.NET Framework 中可用的所有 sound-playing 功能都是 Windows-specific;因此 none 成为 .NET Core。

不过,好消息是 Node.js 有无数的库可以在各种系统上播放声音并且有一个库可以用于 ASP.NET Core可以直接与 Node.js 代码对话。它称为节点服务。不要因为它仅在 ASP.NET Core 上可用而被推迟。本质上,ASP.NET Core 与 ASP.NET 的 .NET Framework 版本不同,只不过是标准控制台应用程序之上的一层薄薄的 Web 托管功能 运行。您不一定必须将它用作网络应用程序,但它会为您提供许多有用的额外功能,例如易于使用的依赖项注入库。

更多

This article 描述了 NodeServices 是如何工作的。真是straight-forward.

现在有一种方法可以使用 NAudio 库(自 1.9.0-preview1 起),但它只适用于 Windows。

所以使用 NAudio,这里是在 .NET Core 中播放声音的代码,假设您是在 Windows 环境中播放声音。

using (var waveOut = new WaveOutEvent())
using (var wavReader = new WaveFileReader(@"c:\mywavfile.wav"))
{
   waveOut.Init(wavReader);
   waveOut.Play();
}

要获得更全球化的解决方案,您应该选择@Fiodar 的解决方案,利用 Node.js。

将包 System.Windows.Extensions 添加到您的项目。

对我来说最好的解决方案是使用 VLC 媒体播放器。它在 Windows 和 Linux 上可用(我想也许是 mac?)。所以,使用这段代码就可以了(运行 on windows + linux。我不知道 MAC):

        public static void Play(string sound)
    {
        string program = "vlc.exe";

        if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            program = "cvlc";

        string path = GetPathSound(sound);

        var pi = new ProcessStartInfo(path)
        {
            Arguments = Path.GetFileName(path) + " --play-and-exit",
            UseShellExecute = true,
            WorkingDirectory = Path.GetDirectoryName(path),
            FileName = program,
            Verb = "OPEN",
            WindowStyle = ProcessWindowStyle.Hidden
        };

        Process p = new Process();
        p.StartInfo = pi;
        p.Start();
        p.WaitForExit();
    }