2013-06-30 100 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; 
    } 
相关问题