Silverlight的音频输出
我期待开发一个Silverlight应用程序,它将从Web服务器中获取数据流(不是音频流本身)。Silverlight的音频输出
然后将操纵数据流以提供某种格式的音频(例如G.711a-Law),然后将其转换成PCM以便可以施加额外的效果(例如增大音量)。
我很好,至此。我已经获得了我的数据,将G.711转换为PCM,但是我的问题是能够将此PCM音频输出到声卡。
我基于某个.NET应用程序的某些C#代码的解决方案,但在Silverlight中,尝试获取代理(函数指针)的副本时会出现问题,这将成为单独问题的主题,已经生成了一个简单的代码示例
所以,问题是......我怎样才能输出我在我的Silverlight中的数据结构(当前是一个数组)中保存的PCM音频给用户? (请不要说将字节值写入文本框)
如果是MP3或WMA文件,我会使用MediaElement播放它,但我不希望将其作为文件存储到此文件中会对音频应用动态效果产生压迫感。
我见过一些人说低级别的音频支持很差/不存在于Silverlight中,所以我愿意接受任何人的建议/想法。
简单的答案是,从Silverlight版本2中不支持PCM播放。所以,除非你想写一个完全托管的PCM到MP3转换器,否则你会被卡住。即使那样我也不确定你可以让MediaElement从孤立的存储中播放。
有没有可能使用Web服务执行转换?
也看到这个问题: Where's the sound API in Silverlight? Or, how do I write a music app to run in the browser?
更新:的Silverlight 3支持自定义音频源。但是,它不会让你拦截样本来对WMA或MP3进行效果,这大概是出于DRM原因,所以你仍然可能需要编写自己的解码器。
马克希思的答案是正确的 - 只支持某些格式 - mp3和某些WMA风格(遗憾的是不是WMA无损,与PCM更接近)。
要在Silverlight中播放PCM数据,您可以执行以下操作:
*将PCM转换为mp3数据并将其存储在内存中。
*使用ManagedMediaHelpers提供的技术播放mp3数据。这里的想法涉及一个名为Mp3MediaStreamSource的类(从System.Windows.Media.MediaStreamSource派生),它为MediaElement播放提供了mp3块。这些块需要在流中,但是当然会有内存流。
我最初认为你可能能够通过MediaStreamSource提供PCM块,但这是行不通的。这真是太遗憾了,因为它可以很容易地解决你的问题(以及我正在面对的 - 制作Speex音频文件播放器)!
看起来Silverlight 3现在支持直接PCM输出,或者将会在发布时支持。我还没有看到有关原始AV管道的文档中的任何内容。
简短的回答是使用MediaElement的+一个媒体流
查阅这些:
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看起来并不会让我做我想做的事(然而 - 也许有时候会这样),所以现在我将焦点转向WPF/XBAP。只需要理清部署一个完全可信的应用程序,但如果我正在努力挣扎,我会提出另一个问题。 – LeeC 2009-03-02 09:15:48