【问题标题】:Mediaelement in Windows 8 Metro AppWindows 8 Metro 应用程序中的 Mediaelement
【发布时间】:2013-06-30 10:05:23
【问题描述】:

我有一个特定于我的应用的场景。我正在为我的 Metro 应用程序管理 XML 格式的音乐文件播放列表。它保存音乐文件的实际路径是这样的

D:\MyMedia\1.mp3

我的 XAML 页面中有媒体元素,我正在像这样设置它的源。

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

但它不播放媒体并给出这样的错误

MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED : HRESULT - 0x80070005

所以有人告诉我如何使用绝对路径在 Metro 应用程序的 MediaElement 中播放一些媒体文件。或者我如何获取本地文件流以在 Metro 应用程序的 mediaElement 中播放此媒体。

【问题讨论】:

    标签: c# xaml windows-runtime windows-store-apps winrt-xaml


    【解决方案1】:

    要在本地系统上打开文件,可以使用 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();
    }
    

    【讨论】:

    • @Antorio:正如我在问题中提到的,我已经将播放列表表示为所有位置。然后没有打开文件选择器的逻辑,这不是我问题的真正答案,但是感谢您的帖子
    • @ArslanPervaiz 我认为它是您问题的准确答案。您使用的代码适用于 WPF 应用程序,但根据我的经验,不适用于 WinRT。因此,您必须根据此答案设置来源,而不是根据您发布的 Source =。
    【解决方案2】:

    您只能访问用户 PC 上有限数量的位置。 “D:\Mymedia”不是其中之一。您将在 Microsoft 帮助中找到所有必要的信息。看看这两篇文章:

    【讨论】:

      【解决方案3】:

      这可以在没有文件选择器的情况下完成。您只需将音乐库功能添加到您的应用清单中,确保音乐位于“我的音乐”或 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();
                  }
              }
          }
      

      【讨论】:

        【解决方案4】:

        我知道这是一个老问题,我找到了一个非常简单的解决方案..

        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;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-03
          • 1970-01-01
          • 2012-06-29
          • 2013-08-08
          • 1970-01-01
          • 2012-10-14
          相关资源
          最近更新 更多