本次作业要求为第一次的MediaPlayer增添两个功能,其一是在线播放音频,其二是缓存到本地文件在播放功能,下面简述这两个功能分别是如何实现的:
(一)在线播放音频
通过百度搜索,我发现了想要在线获取数据流,要进行一个叫做“自适应流式处理的方法”,于是,我在微软的官方文档中找到了它以及它的用法 (https://docs.microsoft.com/zh-cn/windows/uwp/audio-video-camera/adaptive-streaming)
微软官方给出了这样的在线播放方法:调用
MediaSource.CreateFromUri 以从 DASH 或 HLS 清单文件的 URI 创建一个
MediaSource。 然后设置
MediaPlayerElement 的
Source 属性。
MediaPlayerElement 将为该内容自动创建一个新的
MediaPlayer 对象。 你可以在
MediaPlayer 上调用
Play 以开始播放内容。于是,我根据官方指南在click事件中添加了如下的代码:
private void AppBarButton_Click(object sender, RoutedEventArgs e)
{
System.Uri manifestUri = new Uri("http://www.neu.edu.cn/indexsource/neusong.mp3");
MediaPlayer.Source = MediaSource.CreateFromUri(manifestUri);
}
{
System.Uri manifestUri = new Uri("http://www.neu.edu.cn/indexsource/neusong.mp3");
MediaPlayer.Source = MediaSource.CreateFromUri(manifestUri);
}
于是,校歌的在线播放功能就实现了,附截图一张:
![](https://i-blog.csdnimg.cn/blog_migrate/d06994f056994169a29a1656c6bbb025.png)
(二)缓存到本地文件功能
这个功能着实是花了我很长时间,在资料的查找和运用上走了很多的弯路,但最后磕磕绊绊也算是实现了,但是感觉代码实现上还不能说是完全理解。首先呢,缓存到本地文件可以拆解为两个步骤,第一个是缓存,第二个是存入文件。对于缓存功能的实现,我参考了微软官方文档(https://docs.microsoft.com/en-us/uwp/api/Windows.Web.Http.HttpClient),先将想要下载的内容缓存到buffer中,代码如下:
var httpClient = new HttpClient();
var buffer = await httpClient.GetBufferAsync(new Uri("http://www.neu.edu.cn/indexsource/neusong.mp3"));
var buffer = await httpClient.GetBufferAsync(new Uri("http://www.neu.edu.cn/indexsource/neusong.mp3"));
这就实现了第一步,缓存,于是到了第二步,在MusicFolder下创建一个新文件,并将buffer中内容保存在其中,我在官方文档中(https://docs.microsoft.com/zh-cn/windows/uwp/files/quickstart-managing-folders-in-the-music-pictures-and-videos-libraries)找到了一个这样的方法:
![](https://i-blog.csdnimg.cn/blog_migrate/5d54c9b23df3426bd86b58e39db2d0fc.png)
于是,我加了 StorageFile destinationFile = await KnownFolders.MusicLibrary.CreateFileAsync("东北大学校歌.mp3");
为buffer预创建了一个mp3类型的文件,但是,这里有又遇到了问题,如何将buffer存入文件,这个问题我看了n多个博客,最后在整合出来了一个相对来说满意的方法,代码如下:
using (var stream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite))
{
await stream.WriteAsync(buffer);
await stream.FlushAsync();
}
这个操作就是说将buffer写入文件,然后将stream对象资源释放,以节约内存,于是乎,缓存并保存功能就此实现,最后在click函数的末尾加上
var mediaSource = MediaSource.CreateFromStorageFile(destinationFile);
MediaPlayer.Source = mediaSource;
MediaPlayer.Source = mediaSource;
就可以播放了
但是,但是,但是,这都是我以为,最头疼的问题,也是耗费了我最多时间的问题出现了,运行报错,缺少访问权限,这个问题我各种百度修改文件夹权限,又在系统的命令行里更改,可是都无济于终。最后,我在和同学的讨论中得到了良好启发,大神告诉我在vs2017中添加音乐库权限
![](https://i-blog.csdnimg.cn/blog_migrate/031d76c4b9031bd622085cb696d7e32f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6ef13971660fd5f10ceff76d558a5b5f.png)
只需要将音乐库勾选上即可,运行成功,不得不佩服同学之中的大佬!
费尽千辛万苦,最后的运行效果如图
![](https://i-blog.csdnimg.cn/blog_migrate/546bf1567304c449ceb578cf392f5658.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d79ab39b32b2366f9aac301062306c47.png)
最后附上GitHub的URl链接:https://github.com/tyuchn/homework--A-basic-player