UWP-Naïve Media Player 2.0

原创 2018年04月15日 17:38:27

哇,做完觉得自己是真的菜!

本次2.0版(GitHub地址)1.0版的基础上加了一些要了命的东西!比如:下载在线音乐至本地文件夹!

由于1.0版本在发布之初就觉得十分丑陋,加之学习了navigationview,觉得是个美化外观的很好选择,于是首先将要实现的内容加至了navigationview的menuitem中,通过Frame的跳转实现不同功能。主界面如下:



事实上,2.0版在1.0版的基础上多了两个主要功能:

其一:实现文件在线播放。

其二:缓存在线文件至本地并能够播放。

如果说没有遇到问题,那可就太对不起自己花费的时间了,具体问题如下:


1、在线播放功能的实现

天真的我开始以为只要提供给用户输入URL的端口即可,后来自己都被自己的想法蠢到了,于是开始翻阅相关资料。由于水平有限,没有在官方文档上找到太多有用的信息,还是csdn救了我,找到了一个类似的求助帖,主要在讲需要将文件或流获取到本地。其中给出了这样的一个解决方案:

将该方法加以修改代入到"东北大学校歌"后发现这个播放器就只能播放东大校歌了,虽然实现了基本要求,但对于一款播放器而言,无疑是很低端的,于是进一步改良以求的其能播放更多的在线音乐。

这里我增添了Text Box以方便用户输入链接,用户点击播放button后,将textbox的输入内容传给uri,调用MediaElement即可自动播放资源文件。具体实现如下:

private void OnlinePlayButton_Click(object sender, RoutedEventArgs e)
        {
            Uri uri = new Uri(MyBox.Text);
            MyMediaPlayer.Source = uri;
        }

虽然可以实现在线播放功能,不过个人还有一个问题仍未解决。

在测试该UWP时本人除了测试东大校歌之外还测试了网易云音乐等网页的链接,发现其并不能播放,但是各大高校的校歌却能通过链接成功播放,仔细分析后发现能播放的文件尾缀均为.mp3,而网页版却不是,询问同学觉得可能是由于MediaElement只支持MP3等形式的文件而不是HTML形式的文件导致此原因的吧,只是一个猜想~


2、在线音乐的下载播放

看到这个问题后真的就是无从下手了,不得不慢慢啃起了官方文档。由于自己水平有限,在啃文档的过程中也遇到了不少麻烦,还是需要度娘解决,就这样一边文档,一边度娘,将此问题加以分解,先从添加文件开始。

由于上述功能已经实现播放在线音乐,url的使用已经建立,主要是如何将其读入文件中。

起初查到的资料讲述了如何将固定链接的内容下载至本地,虽然替换为校歌网址后可以实现,但又回到了最初的问题,就是只能播放一个固定的资源文件,于是想办法解决该问题。

查阅官方文档给出了这样的说明:

虽然一脸懵逼,但还是照做了,不过结果就是错误了。继续参考文档说明:

StorageFolder testFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\test");
StorageFile sourceFile = await testFolder.GetFileAsync("TestImage.jpg");
StorageFile destinationFile = await KnownFolders.CameraRoll.CreateFileAsync("MyTestImage.jpg");

using (var sourceStream = await sourceFile.OpenReadAsync())
{
    using (var sourceInputStream = sourceStream.GetInputStreamAt(0))
    {
        using (var destinationStream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            using (var destinationOutputStream = destinationStream.GetOutputStreamAt(0))
            {
                await RandomAccessStream.CopyAndCloseAsync(sourceInputStream, destinationStream);
            }
        }
    }
}

以及httpclient的相关内容,求教同学后对其修改,内容如下:

            var httpClient = new HttpClient();
            var httpResponse = new Windows.Web.Http.HttpResponseMessage();
            var file = await KnownFolders.MusicLibrary.CreateFileAsync(FileName, CreationCollisionOption.ReplaceExisting);
            string httpResponseBody = "";
            try
            {
                httpResponse = await httpClient.GetAsync(uri);
                httpResponse.EnsureSuccessStatusCode();
                httpResponseBody = await httpResponse.Content.ReadAsStringAsync();
                var sourceStream = await httpResponse.Content.ReadAsInputStreamAsync();
                using (var destinationStream = await file.OpenAsync(FileAccessMode.ReadWrite))
                {
                    using (var destinationOutputStream = destinationStream.GetOutputStreamAt(0))
                    {
                        await RandomAccessStream.CopyAndCloseAsync(sourceStream, destinationStream);
                    }
                }
                var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
                MyMediaPlayer.SetSource(stream, file.ContentType);
                MyMediaPlayer.Play();

            }
            catch {}

这样就简单实现了将在线音乐下载至本地媒体库(这里为音乐库)中,同时还需注意,在上述工作开展前还需要设置访问权限,也即:


否则并不能顺利播放你想要的资源!

同时还有一个小问题,对于下载的文件,我们希望获得他的名字并保存,如何增加名字呢?

在最初,我想到再次添加textbox,通过用户输入的textbox的内容实现自动保存。于是在c#中download的click事件增加textbox,发现该想法并不能成功实现。查阅资料后发现c#可以自动识别,具体如下:

尝试后发现真的好使,于是该功能至此算是简单结束。具体如下:

private async void DownLoadButton_Click(object sender, RoutedEventArgs e)
        {
            Uri uri = new Uri(MyBox.Text);
            MyMediaPlayer.Source = uri;
            string FileName = System.IO.Path.GetFileName(uri.LocalPath);
            
            var httpClient = new HttpClient();
            var httpResponse = new Windows.Web.Http.HttpResponseMessage();
            var file = await KnownFolders.MusicLibrary.CreateFileAsync(FileName, CreationCollisionOption.ReplaceExisting);
            string httpResponseBody = "";
            try
            {
                httpResponse = await httpClient.GetAsync(uri);
                httpResponse.EnsureSuccessStatusCode();
                httpResponseBody = await httpResponse.Content.ReadAsStringAsync();
                var sourceStream = await httpResponse.Content.ReadAsInputStreamAsync();
                using (var destinationStream = await file.OpenAsync(FileAccessMode.ReadWrite))
                {
                    using (var destinationOutputStream = destinationStream.GetOutputStreamAt(0))
                    {
                        await RandomAccessStream.CopyAndCloseAsync(sourceStream, destinationStream);
                    }
                }
                var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
                MyMediaPlayer.SetSource(stream, file.ContentType);
                MyMediaPlayer.Play();
            }
            catch {}
        }

本功能成效图如下:

点击play时自动播放在线资源,点击download时缓存至本地媒体库(音乐库)并播放资源文件,当然,该缓存文件可以通过打开本地文件的方法实现资源文件的播放。


本次作业的功能至此虽然已经基本实现,但是许多内容还不了解,大多是通过不断试错才产生了2.0版本,还是要继续啃文档啊~






UWP-Naïve Media Player 1.0

首先,先呈上GitHub项目地址:https://github.com/GTGO/NavieMediaPlayer本次项目主要实现了播放MP3,MP4,也即一个简单而又丑陋的播放器。实现的效果图如下:...
  • weixin_34174649
  • weixin_34174649
  • 2018-04-03 10:17:05
  • 24

干净卸载Windows Media Player的工具

  • 2012年05月05日 10:30
  • 8.96MB
  • 下载

使用VLC media player搭建简单的流媒体服务器

用VLC media player搭建简单的流媒体服务器
  • GISuuser
  • GISuuser
  • 2017-09-09 10:05:58
  • 834

Quintessential Media Player v5.0 简中汉化包

  • 2014年01月28日 10:54
  • 1.84MB
  • 下载

Android之MediaPlayer 音频播放

MediaPlayer通过如下两个静态方法来加载指定的音频:  1、static  MediaPlayer  create(Context context,Uri uri):从指定的Uri来装载音频文...
  • x605940745
  • x605940745
  • 2014-01-09 17:00:54
  • 4523

windows media player 控件的常用属性及方法【转载】

windowsmediaplayer 控件在我们编程时经常要用到,但是有很多属性及方法却不知道该怎么使用。(JavaScript中用法几乎完全相同)。     假设此控件名为wmp ...
  • zhongxia245
  • zhongxia245
  • 2014-04-13 23:04:13
  • 1801

Windows Media Player 出现内部错误修复方法

regsvr32 %windir%/system32/jscript.dllregsvr32 %windir%/system32/vbcript.dll
  • scz123
  • scz123
  • 2006-11-22 15:51:00
  • 2808

Windows media player皮肤随意改(原创)

Windows media player皮肤随意改                                  提起Windows media player可以说是无人不知无人不晓了,这个大名鼎...
  • accp_fangjian
  • accp_fangjian
  • 2004-12-06 12:43:00
  • 8622

windows media player不显示图像只有声音

应该是转码问题,下载了好多个解码器都不好用,最后下载了一个K-lite codec,完美解决! 网址:http://rj.baidu.com/soft/detail/27005.html?ald ...
  • lyq_0827
  • lyq_0827
  • 2017-06-26 09:09:36
  • 1855

Android音乐播放——MediaPlayer, unable to create media player

2013-06-23 导语:有些问题很纠结,第一次写有声音的软件,各种问题! 正文:我在网上找了如何使用MediaPlayer的方法,用在程序上,结果发现始终有问题...
  • u011425961
  • u011425961
  • 2014-10-16 12:51:17
  • 690
收藏助手
不良信息举报
您举报文章:UWP-Naïve Media Player 2.0
举报原因:
原因补充:

(最多只允许输入30个字)