2

我正在寻找一个 Silverlight 应用程序,它将从 Web 服务器获取数据流(不是音频流本身)。

然后将操纵数据流以提供某种格式的音频(例如 G.711 a-Law),然后将其转换为 PCM,以便应用附加效果(例如提高音量)。

到目前为止我还可以。我有我的数据,将 G.711 转换为 PCM,但我的问题是能够将此 PCM 音频输出到声卡。

我的解决方案基于一些用于 .Net 应用程序的 C# 代码,但在 Silverlight 中,尝试获取委托(函数指针)的副本时会出现问题,一旦我生成了一个简单的问题,这将成为单独问题的主题代码示例。

所以,问题是......如何将我在 Silverlight 中的数据结构(当前为数组)中保存的 PCM 音频输出给用户?(请不要说将字节值写入文本框)

如果它是 MP3 或 WMA 文件,我会使用 MediaElement 播放它,但我不想将其制成文件,因为这会影响对音频应用动态效果。

我看过一些帖子,有人说 Silverlight 中的低级音频支持很差/不存在,所以我愿意接受人们可能提出的任何建议/想法。

4

4 回答 4

4

简单的答案是版本 2 中的 Silverlight 不支持 PCM 播放。因此,除非您想编写一个完全托管的 PCM 到 MP3 转换器,否则您会被卡住。即使那样,我也不确定您是否可以让 MediaElement 从独立存储中播放。

您是否有机会使用网络服务来执行转换?

另请参阅此问题: Silverlight 中的声音 API 在哪里?或者,我如何编写一个音乐应用程序以在浏览器中运行?

更新: Silverlight 3 支持您的自定义音频源。但是,它不会让您截取样本以在 WMA 或 MP3 上执行效果,大概是出于 DRM 的原因,因此您仍然可能需要编写自己的解码器。

于 2009-02-25T13:00:22.433 回答
2

简短的回答是使用 MediaElement + MediaStreamSource

看看这些:

http://blogs.msdn.com/gillesk/archive/2009/03/23/playing-back-wave-files-in-silverlight.aspx

http://code.msdn.microsoft.com/wavmss/Release/ProjectReleases.aspx?ReleaseId=2417

基本上,在托管代码中编写一个解码器以将 G.711 a-Law 转换为 PCM,然后对原始值进行任何修改,然后将它们传递到 MediaStreamSource。

于 2009-04-06T21:33:11.893 回答
0

Mark Heath 的回答是正确的 - 仅支持某些格式 - mp3 和某些风格的 WMA(不幸的是不是 WMA 无损,它会“更接近”PCM)。

要在 Silverlight 中播放 PCM 数据,您可以执行以下操作:
* 将 PCM 转换为 mp3 数据,并将其存储在内存中。* 使用ManagedMediaHelpers
介绍的技术播放 mp3 数据。这里的想法涉及一个名为 Mp3MediaStreamSource 的类(派生自 System.Windows.Media.MediaStreamSource),该类将 mp3 块提供给 MediaElement 以进行播放。块需要在流中,但当然可以使用内存流。

我最初以为您可以通过 MediaStreamSource 提供 PCM 块,但这不起作用。真的很遗憾,因为它可以很容易地解决您的问题(以及我面临的问题 - 制作 Speex 音频文件播放器)!

于 2009-03-06T16:24:24.490 回答
0

看起来 Silverlight 3 现在支持直接 PCM 输出,或者将在发布时支持。我在文档中还没有看到关于原始 AV 管道的任何内容。

于 2009-03-20T16:59:03.210 回答