Naïve Media Player, Part 2
项目主页网址:
https://github.com/Judylalala/en
Q1:如何播放online歌曲?
A1:我本来以为会为MediaElement设置一个单独的属性播放online音频、视频文件,后来发现用的也是Source,在Source中确定播放音频的网页地址。
播放online校歌的xaml代码如下:
<StackPanel Orientation="Horizontal">
<MediaElement x:Name="mediaPlayer"
Source="http://www.neu.edu.cn/indexsource/neusong.mp3"
MaxWidth=""
AutoPlay="False"
AreTransportControlsEnabled="True"
Margin="78,70,100,70"/>
<Button Content="Choose" Click="Button_Click"/>
</StackPanel>
Q2:如何将在线歌曲下载到本地?
A2:我在这个网址:https://www.cnblogs.com/T-ARF/p/5886153.html
里面找到了使用下载网页的上的音频并保存的方法,代码如下:
private async Task<StorageFile> GetVoiceData()
{ HttpClient httpclient = new HttpClient();
var GetData = await httpclient.GetStreamAsync(new Uri("http://dx.sc.chinaz.com/Files/DownLoad/sound1/201207/1771.mp3"));
var file = await ApplicationData.Current.LocalCacheFolder.CreateFileAsync("1771.mp3", CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenStreamForWriteAsync())
{
await GetData.CopyToAsync(stream);//将获取的HttpClient的Stream流复制到文件的stream流
await stream.FlushAsync();//异步刷新 } return This_Voice_files;
}
}
然后将网址和文件名称做了修改:
public async Task<StorageFile> Load()
{
try
{
var httpClient = new HttpClient();
var buffer = await httpClient.GetBufferAsync(new Uri("http://www.neu.edu.cn/indexsource/neusong.mp3"));
if (buffer != null && buffer.Length > 0u)
{
var file = await ApplicationData.Current.LocalCacheFolder.CreateFileAsync("neusong.mp3", CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
await stream.WriteAsync(buffer);
await stream.FlushAsync();
}
return file;
}
}
catch { }
return null;
}
但是这个方法只是将网页上的音频文件保存到了应用程序默认进行数据存储的位置,而不是下载到音乐文件夹中。
那么:
Q3:如何定位音乐文件夹?
A3:我一开始并没有找到直接将下载文件存到音乐文件夹的办法,但我找到了打开音乐文件夹时初始定位音乐文件夹的办法,我在这个网址:https://docs.microsoft.com/zh-cn/windows/uwp/audio-video-camera/media-playback-with-mediasource
里面的“创建并播放 MediaSource”中找到了下面这段C#代码:
//Create a new picker
var filePicker = new Windows.Storage.Pickers.FileOpenPicker(); //Add filetype filters. In this case wmv and mp4.
filePicker.FileTypeFilter.Add(".wmv");
filePicker.FileTypeFilter.Add(".mp4");
filePicker.FileTypeFilter.Add(".mkv"); //Set picker start location to the video library
filePicker.SuggestedStartLocation = PickerLocationId.VideosLibrary; //Retrieve file from picker
StorageFile file = await filePicker.PickSingleFileAsync(); if (file != null)
{
mediaSource = MediaSource.CreateFromStorageFile(file);
mediaElement.SetPlaybackSource(mediaSource);
}
其中的这两行代码确定了在选择文件的时候,初始定位到哪里:
//Set picker start location to the video library
filePicker.SuggestedStartLocation = PickerLocationId.VideosLibrary;
但是这个代码定位的是视频库,所以我试着将视频库改成音频库,修改的部分如下(不要注意openPicker和filePicker名字不一样,因为找的代码里的名字和我定义的名字不一样):
//Set picker start location to the music library
openPicker.SuggestedStartLocation = PickerLocationId.MusicLibrary;
然后跑了一下,发现这次可以在选择文件夹的时候初始定位到音乐文件夹,而且我发现,虽然用户可以对这个系统自带的文件夹进行挪动和重命名,可是不论我怎么挪动它到别的磁盘、或者到桌面,也不论我把它的名字改成什么,这段代码都可以精准地初始定位到这个音乐文件夹。
那么,是不是我也可以利用MusicLibrary来将文件准确地存到音乐文件夹中,然后我在:https://docs.microsoft.com/zh-cn/windows/uwp/files/file-access-permissions
这个网址里找到了访问通过KnownFolders.MusicLibrary来访问MusicLibrary的办法。
那么问题来了:
Q4:如何保存下载的文件到音乐文件夹?
A4:我将上面那段将网页上的音频文件保存到本地文件夹的代码改了一下:
public async Task<StorageFile> Load()
{
try
{
var httpClient = new HttpClient();
var buffer = await httpClient.GetBufferAsync(new Uri("http://www.neu.edu.cn/indexsource/neusong.mp3"));
if (buffer != null && buffer.Length > 0u)
{
StorageFile newFile = await KnownFolders.MusicLibrary.CreateFileAsync("neusong.mp3", CreationCollisionOption.ReplaceExisting);
//var newFile = await ApplicationData.Current.LocalCacheFolder.CreateFileAsync("neusong.mp3", CreationCollisionOption.ReplaceExisting);
using (var stream = await newFile.OpenAsync(FileAccessMode.ReadWrite))
{
await stream.WriteAsync(buffer); await stream.FlushAsync();
} return newFile;
}
}
catch { }
return null;
}
通过KnownFolders.MusicLibrary.CreateFileAsync()这个方法将校歌存到了音乐文件夹中。
与此同时,为我的应用程序增加访问音乐库的权限:

然后成功了......
最后展示一下运行结果:
初始状态是在播放一个视频文件:

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

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

Naïve Media Player, Part 2的更多相关文章
- Naïve Media Player
我的GitHub链接:https://github.com/Joyce45/hwt 一.播放器?怎么做? 提到播放器,首先想到的就是XAML控件库里的MediaElement,于是我又大致阅读了一下该 ...
- 用VLC Media Player搭建简单的流媒体服务器
VLC可以作为播放器使用,也可以搭建服务器. 在经历了Helix Server和Darwin Streaming Server+Perl的失败之后,终于找到了一个搭建流媒体简单好用的方法. 这个网址中 ...
- android错误之MediaPlayer用法的Media Player called in state *,androidmediaplayer
用到Media Player,遇到几个问题,记一下 用法就不说了,使用的时候最好参考一下mediaPlayer的这张图 第一个错误是Media Player called in state 8 这个是 ...
- win7自带windows media player 已停止工作
解决方法如下: 在计算机开始,菜单找到控制面板 ,然后打开程序和功能,选择打开或关闭window功能,媒体功能.再取消windows Media Center Windows MediaPlayer选 ...
- 转:Media Player Classic - HC 源代码分析
VC2010 编译 Media Player Classic - Home Cinema (mpc-hc) Media Player Classic - Home Cinema (mpc-hc)播放器 ...
- Media Player 把光盘中的内容拷贝出来的方法
http://jingyan.baidu.com/article/cb5d610529f0c1005c2fe0b4.html 这个链接是通过Media Player 把光盘中的内容拷贝出来的方法h ...
- 20 Free Open Source Web Media Player Apps
free Media Players (Free MP3, Video, and Music Player ...) are cool because they let web developers ...
- Windows Media Player安装了却不能播放网页上的视频
前段时间遇到Windows Media Player安装了却不能播放网页上的视频的问题,在网上查找资料时,发现大部分资料都没能解决我这个问题.偶尔试了网上一牛人的方法,后来竟然解决了.现在再找那个网页 ...
- 如何在Windows中打开多个Windows Media Player
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何在Windows中打开多个Windows Media Player.
随机推荐
- SQL CE 和 SQLite数据库对比测试
于项目需要,在客户端需要做数据存储功能,考虑到部署方便同时满足功能需要的情况下选择了SQLCE 和SQLite两种数据库进行客户端数据存储.当然还有很多其他的方式做本地数据存储,比如本地文件存储.微软 ...
- VUE中/deep/深度作用域
vue中css样式不起作用,用!important也不起作用,此时需要用 /deep/ ,没加之前是 加了之后起作用了,此时这个deep是深度作用域
- flutter 登录后跳转到根路由
flutter 登录以后 会有返回箭头显示 因为 路由的切换导致不是路由的第一个页面,解决办法清空路由. Navigator.of(context).pushAndRemoveUntil( new ...
- Unity中各种格式计时器
问题背景: 在开发游戏过程中,很多地方需要倒计时,但是各种地方要的倒计时格式不同,倒计时都会写,在这里不详细介绍,写的目的就是为了记录一下,方便复用(为了在开发过程中不为了小问题浪费不必要脑细胞) 1 ...
- Keil相关问题
1.keil重选则器件 2. 移植FREERTOS出错 .\Objects\RTOSDemo.axf: Error: L6406E: No space in execution regions wit ...
- CollectionUtils工具类的常用方法
集合判断: 例1: 判断集合是否为空: CollectionUtils.isEmpty(null): true CollectionUtils.isEmpty(new ArrayList()): t ...
- thinkPHP实现APP微信支付
控制器 class Pay extends Controller { const WX_PAY_URL = "https://api.mch.weixin.qq.com/pay/unifie ...
- C# dynamic类型序列化和反序列化之Newtonsoft.Json,动态解析远端返回的jSON数据
一.说明 1.Newtonsoft.Json 中的Linq To Json中提供了方便的json数据查询.修改等操作. 例如:JObject,JArray 2.在JObject.FromObject( ...
- redis 实现
/** * Returns a string containing the string representation of each of {@code parts}, using the * pr ...
- Qwt 编译 配置 使用
QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类, ...