【问题标题】:Play Background Sound and Sound Effect in Windows Phone 8在 Windows Phone 8 中播放背景声音和音效
【发布时间】:2013-07-05 03:31:45
【问题描述】:

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

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

有什么问题:

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

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

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

非常感谢任何建议。

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 感谢您的回答。如何使 MediaElement 成为应用程序框架的一部分?在 App.xaml.cs 中声明?
    • 感谢更新。我已经阅读了该链接,并从 PhoneApplicationPage 中制作了自己的 PhoneApplicationFrame,并且我已在 App.xaml.cs 中将其设置为 RootFrame。为了测试它的工作原理,我尝试了链接上的高度技巧来剪切显示,它也能正常工作。在 XAML 中,我添加了一个 ,但音频没有开始......我错过了什么?我还尝试在我的 MainPage.xaml 中通过 App.RootFrame.BackgroundMedia.Play(); 手动激活它;但没有成功..应用程序中的页面是横向的。我还需要做什么?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多