2013-07-07 162 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。這一切都符合框架設計的使用模式。