c# - 如何以可移植的方式在 C# 中播放压缩的声音文件?

标签 c# .net mono audio oggvorbis

是否有一种可移植的、不受专利限制的方式来在 C#/.Net 中播放压缩的声音文件?我想对程序中发生的各种事件播放简短的“ clang ”。

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

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

[此问题是对 mailing list discussion on mono-dev 的跟进一年前的邮件列表]

最佳答案

我终于重新审视了这个主题,并且使用了来自 BrokenGlass on writing WAVE header 的帮助, 更新了 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");

我很惊讶,但是method Dinah mentioned确实有效。但是,我正在考虑在程序中发生的各种事件中播放短的“ clang ”声音,我不想每次需要“ping!”时都启动用户的媒体播放器。声音。

至于代码项目链接 - 不幸的是,这只是一个 P/Invoke 包装器。

关于c# - 如何以可移植的方式在 C# 中播放压缩的声音文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35896/

相关文章:

c# - 将 TabControl.Items 绑定(bind)到 MenuItem

.net - 如何抑制对话框

c# - C# 中的通用接口(interface)是否可以防止装箱? (.NET 与单声道性能)

.net - MonoTouch App 到 Mono Android

c# - 在不使用 String.Split() 的 c# 中拆分字符串的替代方法是什么

c# - 未提供的 SqlCommand.Parameters.AddWithValue 问题 : Procedure or function X expects parameter @Y,

c# - 如何在 C# 中显示我的结果?

.net - NUnit 多个 TestFixture 等效于 MsTest

c# - 插入日志事件时,TimeCreated 字段不够准确

c# - 如何反序列化没有名称的 JSON 数组?