2013-06-30 95 views
1

我有一個特定於我的應用程序的場景。我正在使用XML管理我的地鐵應用程序的音樂文件播放列表。而其節約的音樂文件,就像這Mediaelement in Windows 8 Metro App

d實際路徑:\瑪雅\ 1.MP3

我有我的XAML頁面媒體元素和我設置的來源是這樣的。

mediaElement.Source = new Uri(@"D:\MyMedia\1.mp3", UriKind.Absolute); 
mediaElement.Play(); 

,但它不是播放的媒體及其給這樣

MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED : HRESULT - 0x80070005 

錯誤所以有人告訴我,我怎麼能在MediaElement的發揮與absoulte路徑Metro應用的一些媒體文件。或者我怎樣才能讓我的本地文件流在Metro應用程序的mediaElement中播放此媒體。

回答

3

要打開本地系統上的文件,您可以使用FileOpenPicker獲取文件和SetSource來設置媒體源。

var openPicker = new Windows.Storage.Pickers.FileOpenPicker(); 

openPicker.FileTypeFilter.Add(".mp3"); 
var file = await openPicker.PickSingleFileAsync(); 

var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read); 

if (null != file) 
{ 
    mediaElement.SetSource(stream, file.ContentType); 
    mediaElement.Play(); 
} 
+0

@Antorio:正如我在我的問題中提到的,我已經有播放列表表示所有位置。然後沒有邏輯打開filepicker,這不是我的問題的真正答案,但感謝您的帖子 –

+1

@ArslanPervaiz我認爲它是您的問題的確切答案。您使用的代碼適用於WPF應用程序,但以我的體驗不在WinRT中。因此,您必須根據此答案而不是Source =按照您的帖子進行SetSource。 – rism

0

這沒有文件選擇器來完成。您只需將音樂庫功能添加到應用清單,確保音樂位於「我的音樂」或SD卡上,然後使用KnownFolders.MusicLibrary。

總之,並與問題的音樂主題保持一致,即

「你可能會認爲文件選擇器...

...但我需要的是StorageFile」

// 
    // Opens and plays song titled "[Cars]You_Might_Think.mp3" 
    // in the 80s folder. 
    // 
    // IMPORTANT: the example song must be in the user's Music 
    // folder or SD card to be found. Also, the app manifest 
    // must have 'Music Library' capabilities enabled. 
    // 
    // 
    // 
    async void OpenAndPlayAwesomeSongFromThe80s() 
    {    
     Windows.Storage.StorageFolder folder = KnownFolders.MusicLibrary; 

     StorageFile song = await folder.GetFileAsync("80s\\[Cars]You_Might_Think.mp3"); 

     if (song != null) 
     { 
      IRandomAccessStream stream = await song.OpenAsync(Windows.Storage.FileAccessMode.Read); 

      if (stream != null) 
      { 
       mediaElement = new MediaElement(); 
       mediaElement.SetSource(stream, song.ContentType); 
       mediaElement.Play(); 
      } 
     } 
    } 
0

我知道這是一個老問題了,我發現了一個非常簡單的解決辦法..

Windows.Storage.StorageFile file = null; 
mediaElement player = new MediaElement(); 


    async Task PlayAsync() 
    { 
     if (file == null) 
     { 
      file = await OpenFileAsync(); 

      try { player.MediaOpened -= Player_MediaOpenedAsync; } catch { } 
      try { player.MediaEnded -= Player_MediaEnded; } catch { } 
      try { player.MediaFailed -= Player_MediaFailed; } catch { } 

      player.MediaOpened += Player_MediaOpenedAsync; 
      player.MediaEnded += Player_MediaEnded; 
      player.MediaFailed += Player_MediaFailed; 

      player.SetPlaybackSource(MediaSource.CreateFromStorageFile(file)); //Works with media playback.. 
      //player.Source = new Uri(mediasource, UriKind.RelativeOrAbsolute); //Doesn't work with media playback for some reason.. 
      Playing = true; 
      Paused = false; 
     } 
     else 
     { 
      if (Paused) 
      { 
       player.Play(); 
       Paused = false; 
      } 
      else 
      { 
       player.Pause(); 
       Paused = true; 
      } 
     } 
    } 

    async Task<StorageFile> OpenFileAsync() 
    { 
     try 
     { 
      var ofd = new FileOpenPicker(); 
      ofd.FileTypeFilter.Add("*"); 
      return await ofd.PickSingleFileAsync(); 
     } 
     catch { } 
     return null; 
    } 
相關問題