如何以便携方式在C#中播放压缩声音文件?

是否有一种便携式,而非专利限制的方式来播放C#/ .Net中的压缩声音文件? 我想在节目中发生的各种事件上播放短暂的“叮当”声。

System.Media.SoundPlayer只能处理WAV,但这些通常很大,可嵌入到可下载的应用程序中。 MP3受专利保护,因此即使有完全管理的解码器/播放器,它也不能自由重新分配。 可用的最佳格式似乎是OGG Vorbis,但我没有运气让任何C#Vorbis库工作(我设法用csvorbis提取原始PCM,但我不知道如何在之后播放它)。

我既不想使用我的应用程序分发任何二进制文件,也不想依赖于P / Invoke,因为该项目至少应该在Windows和Linux上运行。 只要它们与GPL许可兼容,我就可以捆绑.Net程序集。

[这个问题是一年前关于mono-dev邮件列表的邮件列表讨论的后续问题]

我终于重新审视了这个主题,并使用BrokenGlass的帮助编写了WAVE标题 ,更新了csvorbis。 我添加了一个OggDecodeStream ,可以传递给System.Media.SoundPlayer来简单地播放任何(兼容的)Ogg Vorbis流。 用法示例:

 using (var file = new FileStream(oggFilename, FileMode.Open, FileAccess.Read)) { var player = new SoundPlayer(new OggDecodeStream(file)); player.PlaySync(); } 

在这种情况下,“兼容”意味着“当我试用它时它起作用了”。 解码器是完全托管的,在Microsoft .Net上工作正常 – 目前,Mono的SoundPlayer似乎有一个回归导致失真。

已过期:

System.Diagnostics.Process.Start("fullPath.mp3");

我很惊讶,但Dinah提到的方法确实有效。 然而,我正在考虑在节目中发生的各种事件上播放短暂的“叮当”声音,我不想每次我需要做“ping”时启动用户的媒体播放器。 声音。

至于代码项目链接 – 遗憾的是这只是一个P / Invoke包装器。

我既不想使用我的应用程序分发任何二进制文件,也不想依赖于P / Invoke,因为该项目至少应该在Windows和Linux上运行。 只要它们与GPL许可兼容,我就可以捆绑.Net程序集。

不幸的是,它不可能避免分发二进制文件,或避免P / Invoke。 无论如何,.net类库在下面使用P / Invoke,托管代码必须在某些时候与unmanage操作系统API通信,以便做任何事情。

在托管代码中应该可以将OGG文件转换为PCM,但由于.net中没有音频原生支持,因此您确实有3个选项:

  1. 调用外部程序播放声音(如前所述)

  2. P /调用C模块播放声音

  3. P /调用OS API播放声音。

(4.)如果您只在Windows上运行此代码,则可能只使用DirectShow。

P / Invoke可以跨平台方式使用http://www.mono-project.com/Interop_with_Native_Libraries#Library_Names

获得PCM数据后(使用OGG C Lib或托管代码,类似于http://www.robburke.net/mle/mp3sharp/当然存在MP3许可问题),您需要一种方法来玩不幸的是,.net没有对您的声卡或播放流式音频的方法提供任何直接评估。 您可以在启动时将ogg文件转换为PCM,然后使用System.Media.SoundPlayer来播放生成的wav文件。 Microsoft建议的当前方法使用P / Invoke访问操作系统中的声音播放API http://msdn.microsoft.com/en-us/library/ms229685.aspx

用于播放PCM声音的跨平台API是OpenAL,您应该能够使用www.taoframework.com上的OpenAL的c#绑定播放(PCM)声音,您将不幸地需要复制一些DLL和.so文件应用程序,以便它在分发时工作,但这是,正如我之前解释的那样不可避免。

调用位于“System.Diagnostics”中的某些内容来播放声音对我来说是一个非常糟糕的主意。 以下是该function的用途:

  // // Summary: // Starts a process resource by specifying the name of a document or application // file and associates the resource with a new System.Diagnostics.Process component. // // Parameters: // fileName: // The name of a document or application file to run in the process. // // Returns: // A new System.Diagnostics.Process component that is associated with the process // resource, or null, if no process resource is started (for example, if an // existing process is reused). // // Exceptions: // System.ComponentModel.Win32Exception: // There was an error in opening the associated file. // // System.ObjectDisposedException: // The process object has already been disposed. // // System.IO.FileNotFoundException: // The PATH environment variable has a string containing quotes. 

我想你应该看一下fmod,这是所有音频api的母亲

请随时梦想http://www.fmod.org/index.php/download#FMODExProgrammersAPI

XNA Audio API在.net / c#应用程序中运行良好,并且可以很好地为此应用程序工作。 基于事件的触发,以及多个声音的精确播放。 正是你想要的。 哦,还有压缩。

嗯,这取决于特定国家的专利相关法律,但据我所知,没有办法在不违反专利的情况下编写mp3解码器。 我认为针对您的问题的最佳跨平台,开源解决方案是GStreamer 。 它有c#绑定,它迅速发展。 然而,在Windows上使用和构建GStreamer并不是一件容易的事。 这是一个很好的起点。 Banshee项目使用这种方法,但它在Windows上并不真正可用(但是,有一些几乎工作的夜间版本)。 FMOD也是一个不错的选择。 不幸的是,它不是开源的,我发现它的API在某种程度上是C风格的。

有一个纯C#vorbis解码器是开源的:

http://anonsvn.mono-project.com/viewvc/trunk/csvorbis/

不确定这是否仍然相关。 最简单的解决方案是使用NAudio ,这是一个用C#编写的托管开源音频API。 另一件事是尝试使用ffmpeg,并为ffplay.exe创建一个进程(正确的二进制文件在共享版本下)。

如果不使用其他东西进行游戏处理,则无法执行此操作。

使用System.Diagnostic将启动一个外部软件,我怀疑你想要那个,对吧? 当你的程序中出现Y时,你只想让X声音文件在后台播放,对吧?

投票,因为它看起来像一个有趣的问题。 :d