项目主页网址:

https://github.com/Judylalala/en

Q1:如何播放online歌曲?

A1:我本来以为会为MediaElement设置一个单独的属性播放online音频、视频文件,后来发现用的也是Source,在Source中确定播放音频的网页地址。

播放online校歌的xaml代码如下:

  1. <StackPanel Orientation="Horizontal">
  2. <MediaElement x:Name="mediaPlayer"
  3. Source="http://www.neu.edu.cn/indexsource/neusong.mp3"
  4. MaxWidth=""
  5. AutoPlay="False"
  6. AreTransportControlsEnabled="True"
  7. Margin="78,70,100,70"/>
  8. <Button Content="Choose" Click="Button_Click"/>
  9. </StackPanel>

Q2:如何将在线歌曲下载到本地?

A2:我在这个网址:https://www.cnblogs.com/T-ARF/p/5886153.html

里面找到了使用下载网页的上的音频并保存的方法,代码如下:

  1. private async Task<StorageFile> GetVoiceData()
  2. {
  3.  
  4. HttpClient httpclient = new HttpClient();
  5. var GetData = await httpclient.GetStreamAsync(new Uri("http://dx.sc.chinaz.com/Files/DownLoad/sound1/201207/1771.mp3"));
  6. var file = await ApplicationData.Current.LocalCacheFolder.CreateFileAsync("1771.mp3", CreationCollisionOption.ReplaceExisting);
  7. using (var stream = await file.OpenStreamForWriteAsync())
  8. {
  9. await GetData.CopyToAsync(stream);//将获取的HttpClient的Stream流复制到文件的stream流
  10. await stream.FlushAsync();//异步刷新
  11.  
  12. } return This_Voice_files;
  13. }
  14. }

然后将网址和文件名称做了修改:

  1. public async Task<StorageFile> Load()
  2. {
  3.   try
  4.   {
  5.     var httpClient = new HttpClient();
  6.     var buffer = await httpClient.GetBufferAsync(new Uri("http://www.neu.edu.cn/indexsource/neusong.mp3"));
  7.     if (buffer != null && buffer.Length > 0u)
  8.     {
  9.       var file = await ApplicationData.Current.LocalCacheFolder.CreateFileAsync("neusong.mp3", CreationCollisionOption.ReplaceExisting);
  10.       using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
  11.       {
  12.         await stream.WriteAsync(buffer);
  13.         await stream.FlushAsync();
  14.       }
  15.       return file;
  16.     }
  17.   }
  18.   catch { }
  19.   return null;
  20. }

但是这个方法只是将网页上的音频文件保存到了应用程序默认进行数据存储的位置,而不是下载到音乐文件夹中。

那么:

Q3:如何定位音乐文件夹?

A3:我一开始并没有找到直接将下载文件存到音乐文件夹的办法,但我找到了打开音乐文件夹时初始定位音乐文件夹的办法,我在这个网址:https://docs.microsoft.com/zh-cn/windows/uwp/audio-video-camera/media-playback-with-mediasource

里面的“创建并播放 MediaSource”中找到了下面这段C#代码:

  1. //Create a new picker
  2. var filePicker = new Windows.Storage.Pickers.FileOpenPicker();
  3.  
  4. //Add filetype filters. In this case wmv and mp4.
  5. filePicker.FileTypeFilter.Add(".wmv");
  6. filePicker.FileTypeFilter.Add(".mp4");
  7. filePicker.FileTypeFilter.Add(".mkv");
  8.  
  9. //Set picker start location to the video library
  10. filePicker.SuggestedStartLocation = PickerLocationId.VideosLibrary;
  11.  
  12. //Retrieve file from picker
  13. StorageFile file = await filePicker.PickSingleFileAsync();
  14.  
  15. if (file != null)
  16. {
  17. mediaSource = MediaSource.CreateFromStorageFile(file);
  18. mediaElement.SetPlaybackSource(mediaSource);
  19. }

其中的这两行代码确定了在选择文件的时候,初始定位到哪里:

  1. //Set picker start location to the video library
  2. filePicker.SuggestedStartLocation = PickerLocationId.VideosLibrary;

但是这个代码定位的是视频库,所以我试着将视频库改成音频库,修改的部分如下(不要注意openPicker和filePicker名字不一样,因为找的代码里的名字和我定义的名字不一样):

  1. //Set picker start location to the music library
  2. openPicker.SuggestedStartLocation = PickerLocationId.MusicLibrary;

然后跑了一下,发现这次可以在选择文件夹的时候初始定位到音乐文件夹,而且我发现,虽然用户可以对这个系统自带的文件夹进行挪动和重命名,可是不论我怎么挪动它到别的磁盘、或者到桌面,也不论我把它的名字改成什么,这段代码都可以精准地初始定位到这个音乐文件夹。

那么,是不是我也可以利用MusicLibrary来将文件准确地存到音乐文件夹中,然后我在:https://docs.microsoft.com/zh-cn/windows/uwp/files/file-access-permissions

这个网址里找到了访问通过KnownFolders.MusicLibrary来访问MusicLibrary的办法。

那么问题来了:

Q4:如何保存下载的文件到音乐文件夹?

A4:我将上面那段将网页上的音频文件保存到本地文件夹的代码改了一下:

  1. public async Task<StorageFile> Load()
  2. {
  3. try
  4. {
  5. var httpClient = new HttpClient();
  6. var buffer = await httpClient.GetBufferAsync(new Uri("http://www.neu.edu.cn/indexsource/neusong.mp3"));
  7. if (buffer != null && buffer.Length > 0u)
  8. {
  9. StorageFile newFile = await KnownFolders.MusicLibrary.CreateFileAsync("neusong.mp3", CreationCollisionOption.ReplaceExisting);
  10. //var newFile = await ApplicationData.Current.LocalCacheFolder.CreateFileAsync("neusong.mp3", CreationCollisionOption.ReplaceExisting);
  11. using (var stream = await newFile.OpenAsync(FileAccessMode.ReadWrite))
  12. {
  13. await stream.WriteAsync(buffer);
  14.  
  15. await stream.FlushAsync();
  16. }
  17.  
  18. return newFile;
  19. }
  20. }
  21. catch { }
  22. return null;
  23. }

通过KnownFolders.MusicLibrary.CreateFileAsync()这个方法将校歌存到了音乐文件夹中。

与此同时,为我的应用程序增加访问音乐库的权限:

然后成功了......

最后展示一下运行结果:

初始状态是在播放一个视频文件:

点击“放校歌!”按钮后,切换到校歌:

而且程序运行后,Music文件夹中多了一个校歌音频文件:

Naïve Media Player, Part 2的更多相关文章

  1. Naïve Media Player

    我的GitHub链接:https://github.com/Joyce45/hwt 一.播放器?怎么做? 提到播放器,首先想到的就是XAML控件库里的MediaElement,于是我又大致阅读了一下该 ...

  2. 用VLC Media Player搭建简单的流媒体服务器

    VLC可以作为播放器使用,也可以搭建服务器. 在经历了Helix Server和Darwin Streaming Server+Perl的失败之后,终于找到了一个搭建流媒体简单好用的方法. 这个网址中 ...

  3. android错误之MediaPlayer用法的Media Player called in state *,androidmediaplayer

    用到Media Player,遇到几个问题,记一下 用法就不说了,使用的时候最好参考一下mediaPlayer的这张图 第一个错误是Media Player called in state 8 这个是 ...

  4. win7自带windows media player 已停止工作

    解决方法如下: 在计算机开始,菜单找到控制面板 ,然后打开程序和功能,选择打开或关闭window功能,媒体功能.再取消windows Media Center Windows MediaPlayer选 ...

  5. 转:Media Player Classic - HC 源代码分析

    VC2010 编译 Media Player Classic - Home Cinema (mpc-hc) Media Player Classic - Home Cinema (mpc-hc)播放器 ...

  6. Media Player 把光盘中的内容拷贝出来的方法

    http://jingyan.baidu.com/article/cb5d610529f0c1005c2fe0b4.html  这个链接是通过Media  Player 把光盘中的内容拷贝出来的方法h ...

  7. 20 Free Open Source Web Media Player Apps

    free Media Players (Free MP3, Video, and Music Player ...) are cool because they let web developers ...

  8. Windows Media Player安装了却不能播放网页上的视频

    前段时间遇到Windows Media Player安装了却不能播放网页上的视频的问题,在网上查找资料时,发现大部分资料都没能解决我这个问题.偶尔试了网上一牛人的方法,后来竟然解决了.现在再找那个网页 ...

  9. 如何在Windows中打开多个Windows Media Player

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何在Windows中打开多个Windows Media Player.

随机推荐

  1. oracle wallet使用与维护

    oracle wallet使用与维护2015年05月26日 17:58:55 SilenceRiver 阅读数:1614oracle wallet使用与维护---oracle无密码登录分类: Orac ...

  2. 生产宕机dunp配置

    修改线程数 <self-tuning-thread-pool-size-min>100</self-tuning-thread-pool-size-min> <self- ...

  3. MYSQL 单表一对多查询,将多条记录合并成一条记录

    一.描述: 在MySQL 5.6环境下,应工作需求:将一个表中多条某个相同字段的其他字段合并(不太会表达,有点绕,直接上图) 想要达到的效果: 实现SQL语句: SELECT a.books, GRO ...

  4. Linux 允许或者禁止ping

    Linux默认是允许Ping响应的,系统是否允许Ping由2个因素决定的:A.内核参数,B.防火墙,需要2个因素同时允许才能允许Ping,2个因素有任意一个禁Ping就无法Ping. 具体的配置方法如 ...

  5. php 通过curl header传值

    下面是自己整理的通过curl  header传值 方式是post $url = 'http://www.***.com';//此处为传值需要访问的地址 $header = array('token:J ...

  6. DDD - 概述 - 聚合 (三)

    不要再看那些理论啦,说的云里雾里的,绕到你怀疑人生 一句话概括聚合创建:聚合的一致性决定了聚合边界的确定,决定了聚合对象的创建.所谓的一致性即事务的一致性,细化就是 立即性和原子性.

  7. c# MD5及盐值加密

    using System;using System.Collections.Generic;using System.Linq;using System.Security.Cryptography;u ...

  8. 今日报错Cannot access java.lang.String

    public java.long.Long getId() { return id; } public void setId(java.lang.Long id) { this.id = id;} 手 ...

  9. redis的两种安装方法

    原:https://www.cnblogs.com/caokai520/p/4409712.html C# Redis   概念 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦 ...

  10. (八)shell工具-重点

    8.1 cut cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的.cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段输出. 1.基本用法 cut [选项参数]  fil ...