Silverlight的音频输出

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

然后操纵数据流以给出特定格式的音频(例如G.711a-Law),然后将其转换成PCM,以便可以应用附加效果(例如增大音量)。

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

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

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

如果它是一个MP3或WMA文件,我会使用MediaElement播放它,但我不想让它成为一个文件,因为这会给音频应用动态效果带来压力。

我已经看到一些人发帖说Silverlight中的低级音频支持很差/不存在,所以我对人们可能有的任何建议/想法持开放态度。

简单的答案是在版本2中不支持从Silverlight进行PCM播放。因此,除非您想要将完全托管的PCM写入MP3转换器,否则您将陷入困境。 即便如此,我也不确定你是否可以从隔离存储中获取MediaElement。

您是否有可能使用Web服务执行转换?

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

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

简短的回答是使用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。

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

Mark Heath的答案是正确的 – 只支持某些格式 – mp3和WMA的某些风格(遗憾的是不是WMA无损,这将是’更接近’PCM)。

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

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