【问题标题】:How to play a sound in NETCore?如何在 NET Core 中播放声音?
【发布时间】:2017-03-16 21:56:41
【问题描述】:

我正在尝试在 .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一开始是解决服务器场景的,那么有多少服务器有声卡呢?
  • 为什么要从 .Net 核心获得它?在控制台应用程序中,您可以使用 Console.Beep,否则我会看看 Naudio。
  • 因为我想创建一个可以说和听的助手,并利用 .net core 几乎可以从任何地方运行

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


【解决方案1】:

在 .NET Core 支持音频之前,作为一种解决方法,您可以尝试以下方法:

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

当然,这只能在安装了 PowerShell 的 Windows 上工作,但您可以检测您使用的操作系统并采取相应措施。

【讨论】:

    【解决方案2】:

    现在有一种使用 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 的解决方案。

    【讨论】:

    • 应该“waveOut.Init(mp3Reader);”是“waveOut.Init(wavReader);”?
    • 作为一个仅供参考,我发现我需要在播放声音文件后立即放置一个 Thread.Sleep(n),睡眠持续时间至少是正在播放的声音的长度。这是在 Windows 10 上运行的简单 dotnet core 2.2 控制台应用程序中。
    【解决方案3】:

    有一种独立于平台的方法。本质上,.NET Framework 中可用的所有声音播放功能都是特定于 Windows 的。因此,它都没有进入 .NET Core。

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

    更多

    This article 描述了 NodeServices 的工作原理。这真的很简单。

    【讨论】:

    • 感谢分享,但那是在 .Net Core 环境之外
    • 它不必在 .NET Core 环境之外。任何可以运行 .NET Core 的操作系统和 CPU 也可以运行 Node.js。 NodeServices 允许您在同一进程中运行 .NET Core 和 Node.js 代码。该库以完全交互的方式运行 Node.js 代码,而不仅仅是“即发即弃”。例如,在启动 Node.js 代码后,它不会进入下一个 C# 语句,直到 Node.js 代码出错或返回结果。从 Node.js 返回的结果在 .NET 代码中完全可用。您可以从 .NET 应用程序中完全控制 Node、js 应用程序。
    • 我一直在寻求解决完全相同的问题,据我所知,唯一的其他解决方案是使用原生第三方 DLL 的包装库。但是,在这种情况下,您必须编译或找到原始库的特定于环境的版本,其中大部分是严格许可的。 NodeServices 更容易使用。我的具体场景是从 Raspberry Pi 上的 .NET Core 应用程序远程播放声音,这就是我解决它的方法。
    • 好的,我去看看。顺便谢谢。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2011-03-30
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        • 2010-09-06
        • 1970-01-01
        相关资源
        最近更新 更多