2013-02-28 44 views
16

我想在我的WPF應用程序中播放聲音文件。目前,我有以下電話:如何發揮WPF聲音文件資源

private void PlaySound(string uriPath) 
{ 
    Uri uri = new Uri(@"pack://application:,,,/Media/movepoint.wav"); 
    var player = new MediaPlayer(); 
    player.Open(uri); 
    player.Play(); 
} 

現在,如果我指定Media/movepoint.wav爲構建行動Content並加載它,因爲它正常工作的相對或絕對文件路徑,所以我懷疑這事做與Pack URI,但我不能爲我的生活找出什麼。

目標是將文件存儲爲資源,以使其在輸出目錄中不可用。我可以提供WAV副本或MP3副本。

回答

10

我試過這個圖像文件,就uri而言,它和聲音文件一樣工作,因爲它只是另一個資源。我用下面的代碼基本上匹配你所擁有的代碼。

new Uri(@"pack://application:,,,/Resources/logo.png") 

確保您的'媒體'文件夾沒有嵌套在任何其他文件夾中。如果是,則還需要包含該文件夾。

使用.NET Framework 4.0,VS2012。

This link給出了對事物整個「包裝」方案的很好的描述。

編輯

更多有關這個主題的研究似乎表明,你想要做什麼可能無法與音頻或視頻文件。以下摘錄摘自this MSDN page的備註部分。

儘管你可以聲明這個類擴展 應用程序標記語言(XAML)的一個實例,你不能加載和播放其媒體 不使用代碼。要僅在XAML中播放媒體,請使用MediaElement。 另外,如果您在XAML中聲明實例,則唯一實際用途是 填充Player屬性的屬性元素語法。

在使用應用程序分發媒體時,不能將媒體文件作爲項目資源使用。在您的項目文件中,您必須將媒體類型 設置爲內容,並將CopyToOutputDirectory設置爲 PreserveNewest或Always。

MediaPlayer可以在兩種不同的模式下使用,具體取決於驅動播放器的是什麼 :獨立模式或時鐘模式。在獨立的 模式下,MediaPlayer類似於圖像,媒體通過Open方式驅動播放打開 。在時鐘模式下,可將MediaPlayer作爲動畫的目標,因此 它將在控制播放的時序 樹中具有對應的時間軸和時鐘條目。有關媒體模式的更多信息,請參閱多媒體概述 。

MediaPlayer與MediaElement的不同之處在於它不是 控件,它可以直接添加到 應用程序的用戶界面(UI)中。要顯示使用MediaPlayer加載的媒體,必須使用VideoDrawing 或DrawingContext。

+0

乍一看我有點困惑,因爲我們的Pack URI語法是相同的。但是,「Resouces」有什麼特別之處?現在媒體文件夾位於程序集的根目錄。我需要做/ Resources/Media/?謝謝 – xximjasonxx 2013-03-01 21:48:12

+0

剛剛嘗試過PlaySound(「pack:// application:,,, Resources/Media/movepoint.mp3」);並沒有運氣(是的,我更新了代碼):) – xximjasonxx 2013-03-01 21:52:44

+1

感謝您的澄清。我可以理解,爲什麼他們會這樣做,因爲版權侵犯風險。我已經標記了你的答案是正確的。謝謝 – xximjasonxx 2013-03-08 15:36:13

1

下,似乎在.NET框架4.5的工作:

var sri = Application.GetResourceStream(new Uri("pack://application:,,,/MyAssemblyName;component/Resources/CameraShutter.wav")); 

if ((sri != null)) 
{ 
    using (s == sri.Stream) 
    { 
    System.Media.SoundPlayer player = new System.Media.SoundPlayer(s); 
    player.Load(); 
    player.Play(); 
    } 
} 

CameraShutter.wav嵌入爲資源在我的項目(與位於內資源的子文件夾,如包URI表示)。

相關問題