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

时间:2013-07-07 20:02:39

标签: c# audio windows-phone-8 playback

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

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

有什么问题:

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

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

到目前为止,我很困惑并且只是为了解决声音效果问题。

非常感谢任何建议。

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