1

我对 Windows Phone 8 设备的声音播放进行了很多研究,并找到了多种解决方案,但它们与我的情况不太匹配。

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

有什么问题:

  • 对于背景声音,我可以使用BackgroundAudio代理,但它不符合我的要求,因为我希望声音仅在我的应用程序的背景中播放,并在我的应用程序关闭或不活动时停止。
  • 对于音效 - 我试过MediaElement了,这没问题,但我在浏览整个应用程序时无法让它以某种方式播放。如果我离开该页面,媒体将关闭 - 我想我可以将其用于音效技巧。此外,SoundEffect这不是一个很好的解决方案,因为它只能播放 .wav 文件......我只能将它用于声音效果,但不能用于背景声音(大文件)。

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

到目前为止,我很困惑并设法解决了音效问题。

非常感谢任何建议。

4

2 回答 2

1

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

如果您将 a 定义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 中的框架/页面的更多信息,请参阅此 Dzone 文章。

于 2013-07-08T10:55:26.793 回答
0

在实践中,MediaElement 有一些问题,比如可视化树的要求。有一些方法可以绕过它,但它们并不是最佳的。我建议使用 MediaElement 报废并改用 XAudio2。它是本机的,因此默认使用在 c++ 中,但您也可以使用SharpDX从 C# 访问此框架。

XAudio2 的优点是您无需担心导航时声音丢失,因为它不依赖于 UI。另一个优点是您可以使用一个SourceVoice来处理背景音频,而其他 SourceVoice 来处理音效播放。这一切都非常适合框架设计的使用模型。

于 2013-09-18T19:43:16.813 回答