Windows phone 7 WP7可同时/动态播放多个压缩(mp3、wma等)音频文件

Windows phone 7 WP7可同时/动态播放多个压缩(mp3、wma等)音频文件,windows-phone-7,audio,xna,silverlight-3.0,Windows Phone 7,Audio,Xna,Silverlight 3.0,由于尺寸原因,我需要将WP7应用程序与压缩音频(mp3、wma等)捆绑在一起。如何自由/同时播放这些内容 XNA框架只支持WAV文件,因此,除非有一个纯C#托管的代码库可以动态解压缩mp3/wma/ogg(?),否则下一个选项将是 MediaElement。但是我在MediaElement上没有得到好的结果。似乎需要在xaml中专门添加一个MediaElement作为标记,并且不能使用多个实例(多个标记)。一旦我播放某个MediaElement,我就不能在同一页面上播放另一个MediaEleme

由于尺寸原因,我需要将WP7应用程序与压缩音频(mp3、wma等)捆绑在一起。如何自由/同时播放这些内容

XNA框架只支持WAV文件,因此,除非有一个纯C#托管的代码库可以动态解压缩mp3/wma/ogg(?),否则下一个选项将是

MediaElement。但是我在MediaElement上没有得到好的结果。似乎需要在xaml中专门添加一个MediaElement作为标记,并且不能使用多个实例(多个标记)。一旦我播放某个MediaElement,我就不能在同一页面上播放另一个MediaElement。我在引用中找不到任何关于限制的内容(引用非常空)。
我还尝试动态创建MediaElement对象,但这似乎根本无效,或者我根本无法让它播放文件。

您可以使用
MediaElement
并将源文件设置为mp3,但这无法从中的代码更改

MediaElement me = sender as MediaElement;
me.Source = new Uri(
因为您无法将资源加载到源中。 您可以在xaml中使用多个MediaElement并停止它们,然后启动所需的MediaElement。只要预先确定了要在编译时加载的文件

您还可以将这些文件合并为一个文件,并在特定位置播放它们,如下所示

me.Position = new TimeSpan(0, 0, 0, 0, 1);
me.Play();

根据我的经验,目前在WP7上没有很好的解决方案。要么将wavs与XNA结合使用,扩大xap的规模,要么将MP3与非常有限的MediaElement功能结合使用,从而降低了使用它可以实现的功能

您可能可以将一些移植到WP7,我还没有听说过任何,所以可能需要很长的时间


在我的一个应用程序中,在使用了一段时间不同的选项后,我最终决定使用wav+XNA组合。

使用内置的XNA内容管道音效压缩

SoundEffect
内容类型的默认设置是“最佳”压缩质量(实际上,它似乎根本没有压缩)。将压缩质量设置为“低”,您将得到一个小得多的文件。或“中等”的大小和质量之间的良好平衡

要更改此设置,请在解决方案资源管理器中选择
.wav
文件,按F4键打开“属性”窗口,展开“内容处理器”节点,然后更改显示的压缩质量设置


以下是屏幕截图说明:

创建一个新的WP7 XNA游戏项目(或获取一个XNA内容项目)

wav
文件添加到内容项目:

按F4键,在解决方案资源管理器中选择
wav
文件,以打开属性窗口

展开“内容处理器”节点并将压缩质量更改为所需设置


“最佳”设置不会产生压缩(原始波形),“中等”和“低”设置会产生更小的文件。

wav文件属性中没有“内容处理器”节点。我有:构建操作、复制到输出目录、自定义工具、自定义工具名称空间、文件名和文件路径。你确定这是WP7吗?@Jonny你正在将
wav
文件直接添加到常规项目中。您需要使用XNA内容管道项目,然后通过
ContentManager
加载它们。尝试创建一些其他类型的项目,但找不到任何类似内容处理器节点的项目。我认为这是VS2010中Windows Phone无法提供的功能。有人建议使用google和“XNA Game Studio”吗?我只是在使用WP7 SDK。@Jonny我很确定XNA Game Studio附带WP7工具,但如果没有,那就下载它(它是免费的)。在“添加新项目”对话框中,您应该能够创建“空内容项目(4.0)”。如果你的应用程序是Silverlight应用程序,那么你需要让它引用一个“Windows Phone游戏库(4.0)”项目,而该项目又可以引用内容项目的“内容引用”。您可能需要将WP7.1(Mango)作为目标,以便将XNA和Silverlight集成到同一个应用程序中。在查找更多信息后,似乎WP平台上没有提供压缩功能。不幸的是,您似乎是对的。没有好的解决办法。当微软决定应用开发者不需要压缩音频时,他们是怎么想的?当然,您可以使用MediaElement播放mp3/wma,但MediaElement似乎有问题(或者充其量也很有限)。我无法使用XNA+wav,因为这会将我的应用程序从20MB增加到200MB左右——没有人希望通过3G获得这样的应用程序。我的“解决方案”可能会像您所说的那样,通过一次只允许播放一个声音来限制功能,即在播放下一个声音之前停止前一个声音。请参阅。WP7上的XNA支持压缩音效。仅供参考,在XNA 4.0中,我使用DynamicSoundEffectInstance使用纯C代码播放ogg文件-请参见此处的codeplex:
using Microsoft.Xna.Framework.Media;

void PlaySound(string pathToMp3) {
   Song song = Song.FromUri("name", new Uri(pathToMp3, UriKind.Relative));
   Microsoft.Xna.Framework.FrameworkDispatcher.Update();
   MediaPlayer.Play(song);
}