Windows 8 Metro应用程序中的Mediaelement
本文关键字:Mediaelement 应用程序 Metro Windows | 更新日期: 2023-09-27 18:20:38
我有一个特定于我的应用程序的场景。我正在为我的metro应用程序管理XML格式的音乐文件播放列表。它保存音乐文件的实际路径像这个
D: ''MyMedia''1.mp3
我的XAML页面中有media元素,我正在这样设置它的Source。
mediaElement.Source = new Uri(@"D:'MyMedia'1.mp3", UriKind.Absolute);
mediaElement.Play();
但它没有播放媒体,并给出了类似的错误
MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED : HRESULT - 0x80070005
所以有人告诉我如何用absoulte路径在metro应用程序的MediaElement中播放一些媒体文件。或者我如何在Metro应用程序的mediaElement中获取本地文件流以播放此媒体。
要在本地系统上打开文件,可以使用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();
}
在用户的电脑上,您可以访问的位置数量有限。"D:''Mymedia"不是其中之一。您将在Microsoft帮助中找到所有必要的信息。看看这两篇文章:
- Quickstart:以编程方式访问文件
- Windows应用商店应用中的文件访问权限
这可以在没有文件选择器的情况下完成。您只需将音乐库功能添加到应用程序清单中,确保音乐位于"我的音乐"或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();
}
}
}
我知道这是一个老问题,我找到了一个非常简单的解决方案。。
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;
}