如何在NETCore中播放声音?

22

我正尝试在.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首先旨在解决服务器方案,那么有多少服务器有声卡呢? - Lex Li
3
为什么你希望从 .Net core 获取它?在控制台应用程序中,您可以使用 Console.Beep,否则我会查看 Naudio。 - MetaColon
1
因为我想创建一个能够说话、听取指令并利用 .net core 技术在几乎任何地方运行的助手。 - dbraillon
5个回答

10
现在有一种使用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的优势。


1
“waveOut.Init(mp3Reader);” 应该改为 “waveOut.Init(wavReader);” 吗? - Ozraptor
2
顺便说一句,我发现在播放声音文件后需要立即加上一个Thread.Sleep(n),其中n是至少等于声音播放长度的睡眠时长。这是在运行于Windows 10上的简单dotnet core 2.2控制台应用程序中的情况。 - Ozraptor
值得一提的是,截至撰写本文时,NAudio 的最新版本为2.1.0,但从外观上看,他们仍然不支持除 Windows 以外的任何平台。在最新的发布说明中有一项内容,称“改进了定位,使其更易于在非 Windows 平台上使用”,但我不知道这意味着什么,因为没有任何地方提到除 Windows 以外的任何平台。请参见 https://github.com/naudio/NAudio - Mike Nakis

6

在 .NET Core 支持音频之前,您可以尝试类似以下的解决方法:

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

当然,这只适用于安装了PowerShell的Windows操作系统,但是您可以检测您所在的操作系统并相应地进行操作。


1
这很糟糕、可怕、糟糕、不足和不恰当,但它确实以最小的努力解决了手头的问题,即无需深入研究。希望有一天微软会提供一个合适的解决方案。 - Mike Nakis

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

1
你能解释一下这将如何帮助OP的问题吗? - Captain Delano

1

对我来说最好的解决方案是使用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();
    }

0

有一种跨平台的方法可以实现它。基本上,所有在.NET Framework中可用的播放声音功能都是Windows特定的,因此没有一个被包含在.NET Core中。

然而,好消息是Node.js有无数的库可以在各种系统上播放声音,并且ASP.NET Core有一个可以直接与Node.js代码交互的库,叫做NodeServices。不要被它只在ASP.NET Core上可用这个事实所吓到。基本上,ASP.NET Core与ASP.NET的.NET Framework版本不同,它只是运行在标准控制台应用程序之上的一层轻量级Web托管功能。你不一定非要将其用作Web应用程序,但它会为你提供许多有用的额外功能,例如易于使用的依赖注入库。

更多信息

本文描述了NodeServices的工作原理。它非常简单明了。


6
谢谢分享,但那是在 .Net Core 环境之外。 - dbraillon
1
它不必在.NET Core环境之外。任何能运行.NET Core的操作系统和CPU也可以运行Node.js。NodeServices允许您在同一进程中运行.NET Core和Node.js代码。该库以完全交互的方式运行Node.js代码,而不仅仅是“fire and forget”。例如,在启动Node.js代码后,它将无法到达下一个C#语句,直到Node.js代码出错或使用结果回调。从Node.js返回的结果在.NET Code中变得完全可用。您可以从.NET应用程序完全控制Node.js应用程序。 - Fiodar Sazanavets
我曾试图解决完全相同的问题,据我所知,唯一的其他解决方案是使用本地第三方DLL的包装库。然而,在这种情况下,您必须编译或找到特定于环境的原始库版本,其中大部分都是严格许可的。NodeServices更容易使用。我的具体场景是从Raspberry Pi上的.NET Core应用程序远程播放声音,这就是我解决它的方法。 - Fiodar Sazanavets
好的,我会看一下。顺便说一句,谢谢。 - dbraillon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接