如何在NETCore中播放声音?

时间:2017-03-16 21:56:42

标签: c# .net-core audio-player

我试图在.Net Core控制台应用程序中播放声音,但我无法解决这个问题。

我正在寻找.Net Core环境中管理的东西,可能像普通的.Net:

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

在dotnet核心Github上发现了一个问题,他们在那里谈论它。

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

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

5 个答案:

答案 0 :(得分:1)

作为一种解决方法,直到.NET Core获得音频支持,你可以尝试这样的事情:

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

当然,仅适用于安装了PowerShell的Windows ,但您可以检测到您所使用的操作系统并采取相应措施。

答案 1 :(得分:1)

有一种与平台无关的方法。从本质上讲,.NET Framework中可用的所有声音播放功能都是特定于Windows的;因此,它都没有成为.NET Core。

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

更多

This article描述了NodeServices的工作原理。这真的很直白。

答案 2 :(得分:1)

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

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

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

要获得更全面的解决方案,您应该使用@Fiodar的Node.js。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

对我来说最好的解决方案是使用 VLC 媒体播放器。它在 Windows 和 Linux 上可用(我想也许是 mac ?)。所以,有了这个代码就可以了(在 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();
    }