在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用于处理音效播放。 这完全符合框架设计的使用模型。