在Windows Phone 8中播放背景声音和声音效果

我已经研究过很多关于为Windows Phone 8设备播放声音的问题,并找到了多种解决方案,但它们与我的情况不太匹配。

我需要的是:我正在编写一个应用程序(C#+ XAML),它使用文件作为背景声音(在导航整个应用程序时必须处于活动状态),并且还能够播放声音效果。

有什么问题:

  • 对于背景声音我可以使用BackgroundAudio Agent,但它不符合我的要求,因为我希望声音仅在我的应用程序的背景中播放,并在我的应用程序关闭或不活动时停止。
  • 对于声音效果 – 我尝试了MediaElement ,这是好的,但是当我浏览整个应用程序时,我无法以某种方式进行播放。 如果我离开那个页面,媒体会关闭 – 我想我可以用它来制作音效技巧。 另外, SoundEffect不是一个很好的解决方案,因为它只能播放.wav文件……我只能用它来表示声音效果而不能用于背景声音(大尺寸文件)。

那么,如果我选择MediaElement / SoundEffect在应用程序中播放声音效果,我应该如何继续播放背景声音(仅在我的应用内)。 我需要一个解决方案,允许我一次播放2个声音(背景和声音效果),并且只有在应用程序运行时才会播放背景声音(处于活动状态)…

到目前为止,我感到困惑和管理只是为了解决声音效果问题。

任何建议都非常感谢。

您在MediaElement中看到的问题是您将其定义为应用程序页面的一部分,并且一旦它从Visual Tree中消失(即在OnNavigatedFrom之后),它就会停止播放。

如果您将MediaElement定义为“可见”作为应用程序框架的一部分,则在您的应用程序处于活动状态时,音频将继续播放(您自然需要处理停用事件)。

如果你这样做, MediaElement应该适用于你的“背景音频”。

请注意,您的应用中只能有一个活动的MediaElement播放媒体,但您应该可以使用SoundEffect来播放声音效果。

更新:

要将MediaElement放在框架中,您需要创建自定义PhoneApplicationFrame类/ XAML,将MediaElement添加到该XAML,并在App.xaml.cs中引用您的自定义框架。

 // Do not add any additional code to this method private void InitializePhoneApplication() { if (phoneApplicationInitialized) return; // Create the frame but don't set it as RootVisual yet; this allows the splash // screen to remain active until the application is ready to render. RootFrame = new MyCustomPhoneApplicationFrame(); RootFrame.Navigated += CompleteInitializePhoneApplication; 

有关Windows Phone中的Frame / Page的更多信息,请参阅此Dzone文章 。

在实践中,MediaElement有一些像可视树要求的陷阱。 有办法绕过它,但它们不是最佳的。 我建议使用MediaElement进行报废,然后使用XAudio2。 它是原生的,因此默认用法是c ++,但你也可以使用SharpDX从C#访问这个框架。

XAudio2的优势在于,在导航时不需要担心声音丢失,因为它不依赖于UI。 另一个优点是你可以有一个SourceVoice用于处理你的背景音频,还有其他SourceVoices用于处理音效播放。 这完全符合框架设计的使用模型。