我已经研究了很多关于为Windows Phone 8设备播放声音的问题,并找到了多种解决方案,但它们与我的情况不太匹配。
我需要的是:我正在编写一个应用程序(C#+ XAML),它使用文件作为背景声音(在导航整个应用程序时必须处于活动状态),并且还能够播放声音效果。
有什么问题:
BackgroundAudio
代理,但它不符合我的要求,因为我希望声音仅在我的应用程序的背景中播放,并且如果我的应用程序关闭或是不活跃。MediaElement
这是可以的,但是当我浏览整个应用程序时,我无法以某种方式进行播放。如果我离开那个页面,媒体会关闭 - 我想我可以将它用于音效技巧。此外,还有SoundEffect
这不是一个很好的解决方案,因为它只能播放.wav文件......我只能用它来制作声音效果而不能用于背景声音(大尺寸文件)。那么,如果我选择MediaElement / SoundEffect在应用程序中播放声音效果,我应该如何继续播放背景声音(仅在我的应用内)。我需要一个解决方案,允许我一次播放2个声音(背景和声音效果),并且只有在应用程序运行时才会播放背景声音(处于活动状态)......
到目前为止,我很困惑并且只是为了解决声音效果问题。
非常感谢任何建议。
答案 0 :(得分:1)
您在MediaElement
看到的问题是您将其定义为应用程序页面的一部分,并且一旦它从可视树中消失(即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;
请参阅this Dzone article for more about Frame/Page in Windows Phone。
答案 1 :(得分:0)
在实践中,MediaElement有一些像可视树要求的问题。有办法绕过它,但它们不是最佳的。我建议使用MediaElement进行报废,然后使用XAudio2。它是原生的,因此默认用法是在c ++中,但您也可以使用SharpDX从C#访问此框架。
XAudio2的优势在于,在导航时不需要担心声音丢失,因为它不依赖于UI。另一个优点是你可以有一个SourceVoice来处理背景音频,还有其他SourceVoices来处理声音效果播放。这完全符合框架设计的使用模型。