2010-04-11 104 views
0

我轉換一個本地聲音文件的資源,它內置這在我的XAML:Silverlight 4中的MediaElement播放聲音

<UserControl.Resources> 
    <my:Uri x:Key="SoundFiles">file:///c:/Audio/HebrewDemo/Shalom.wav</my:Uri> 
</UserControl.Resources> 

我通過粘貼本地硬盤的MP3文件名成源這樣做,然後點擊了「點「,並選擇」提取價值資源「。

當我運行時,它告訴我「Uri」是無效的,當然,在Intellisense中,我看到其他元素以「uri」開始,但不僅僅是URI本身。

在現實世界中,我想指定一個動態的mp3文件名。例如,我可能有一個用於flashcards的外語單詞數據庫,我想在URL上播放一個聲音文件。不過,我想我會嘗試運行前走......

現在,我想這樣的:

mediaElement1.Source = new Uri(
        "http://HebrewResources.com/SoundFiles/Shalom.mp3", 
         UriKind.Absolute); 
    mediaElement1.Play(); 

在Firefox瀏覽器的狀態欄顯示從網站傳送一些數據。但是,我從來沒有聽到任何聲音。難道它只是一個編碼問題?如果編碼不正確,我會得到一個錯誤嗎?

另外,我可以把Uri語句放在加載中或使它在後臺運行,這樣用戶就可以讀取屏幕,同時聲音文件正在下載?換句話說,當他點擊按鈕聽到聲音文件時,理想情況下它已經爲他預先加載。在這個語言學習應用程序中,用戶將看到一個外語單詞,並嘗試自己發音,然後他將點擊「播放」按鈕來聽取聲音來檢查他的結果。

回答

2

由於Silverlight「sanboxed」安全模型,指向本地文件的第一個代碼在普通Silverlight應用程序中不起作用。在瀏覽器中運行普通的Silverlight應用程序,如果您正在運行已安裝的Winforms/WPF應用程序,則無法像訪問本地資源那樣訪問本地資源。看看這個視頻教程http://www.silverlight.net/learn/videos/all/local-file-access/,如果你想了解更多關於使用Silverlight訪問本地文件的信息。

關於你的第二段代碼,它應該工作,所以很可能它是一個編碼問題,並且不幸的是你通常不會爲這樣的事情得到任何錯誤。

我創建了一個示例應用程序,並將其指向您的mp3文件,但它不起作用,但是快速搜索示例mp3,導致我再次免費獲得(第一次點擊)。使用下面的代碼/網址,它工作正常。

myMediaelement.Source = new Uri("http://www.robtowns.com/music/blind_willie.mp3", UriKind.Absolute); 

關於加載,它會在文件到達設置mediaelement源代碼時開始下載文件。因此,如果您在構造函數或加載事件中設置媒體元素的源代碼,它將自動開始在後臺下載。然後你只需調用myMediaelement.Play();在按鈕上單擊事件。

如果您發現使用Firefox有點受限,那麼需要確定什麼時候以及何時加載了外部文件或Web服務。有一個很好的免費工具叫做Fiddler(http://www.fiddlertool.com/fiddler/version.asp),它可以讓你很容易地監控這些事情。

祝你好運:)

+0

謝謝,我最終在這裏啓動了一個線程,並進行了大量的討論。 http://forums.silverlight.net/forums/p/174934/397840.aspx。我添加了MediaFailed事件,並使用Expression Encoder對文件進行編碼(甚至不知道有一個Expression Encoder)。可悲的是,我怕編碼大約3000個mp3文件。 – NealWalters 2010-04-22 15:11:13

+0

很高興聽到您對它進行了排序,關於編碼您的文件,使用編碼器SDK和Powershell,您可以非常容易地自動執行該流程:)請查看http://www.clarkezone.net/default。 aspx?id = adc33486-4a60-4f3f-9ee0-bb8d81c5c6bf,也許在「表達式編碼器自動化」或類似的東西上搜索一下 – 2010-04-23 00:41:15