2013-07-07 167 views
1

我对Windows Phone 8设备的声音进行了很多研究,发现了多种解决方案,但它们并不完全符合我的情况。在Windows Phone 8中播放背景音效和声音效果

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

什么问题:

  • 背景声音,我可以用BackgroundAudio代理,而是因为我想在我的应用程序的背景只打了声不符合我的要求,和停止如果我的应用程序关闭或不活跃。
  • 对于声音效果 - 我试过MediaElement这是好的,但我无法设法让它以某种方式玩,而我正在浏览整个应用程序。媒体关闭,如果我离开那页 - 我想我可以用这个音效技巧。另外,还有SoundEffect这不是一个很好的解决方案,因为它只能播放.wav文件......我只能将它用于声音效果,而不能用于背景声音(大尺寸文件)。

因此,如果我选择MediaElement/SoundEffect在应用程序中播放声音效果,应如何继续播放背景声音(仅在我的应用程序内)。我需要一个解决方案,允许我一次播放2种声音(背景和音效),并且仅在应用程序运行时(活动时)播放背景声音...

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

任何建议,非常感谢。

回答

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

+0

谢谢你的回答。如何使MediaElement成为应用程序框架的一部分?在App.xaml.cs中声明它? – VasileF

+0

感谢您的更新。我已经阅读了该链接,并从PhoneApplicationPage创建了自己的PhoneApplicationFrame,并将其作为RootFrame在App.xaml.cs中进行了设置。为了测试它的工作原理,我尝试了链接上的高度技巧来切割显示,并且它也可以工作。在XAML中,我添加了一个,但音频无法启动...我缺少什么?我也在我的MainPage.xaml中尝试通过App.RootFrame.BackgroundMedia.Play()手动激活它。但没有成功..应用程序中的页面是风景。还有什么我必须做的? – VasileF

0

实际上,MediaElement有一些像视觉树要求的问题。有办法绕过它,但它们不是最佳的。我建议使用MediaElement进行报废,然后改用XAudio2。它是原生的,因此默认的用法是使用C++,但是您也可以使用SharpDX从C#访问此框架。

XAudio2的优势在于,由于不依赖于用户界面,所以在浏览时不需要担心声音丢失。另一个优点是你可以有一个SourceVoice用于处理你的背景音频,以及其他用于处理音效回放的SourceVoices。这一切都符合框架设计的使用模式。