【跟Z学开发】1.1 做一个最简陋的音频播放器

zcxsythenew UID.911687
2017-07-09 发表

本帖最后由 zcxsythenew 于 2017-7-11 14:23 编辑

专题一 开发一个媒体播放应用
课题1 开发一个非常简陋的播放应用

语言:C#
这一节会绕过XAML的学习,专注于C#和微软的各种API的应用。想学XAML的可以关注后续课程。
我们将在这一节课,尝试制作一个最简陋的音频播放应用。打开这款应用的时候,播放央广的音乐之声;关闭这款应用的时候,停止播放。应该没有比这款应用更简单的了吧?

本节包含:
音频播放
后台音频播放(单进程)
应用的启动和预启动

[backcolor=red]请打开Visual Studio 2017,然后从电脑网页端浏览此教 程。[/backcolor][page]专题一 开发一个媒体播放应用
课题1 开发一个非常简陋的播放应用

第1步 新建空白应用(通用Windows)项目。目标和最低Windows 10版本在本节课中可以任意选择,但保险起见,建议两个都选择1703,但如果要测试的设备版本低于1703就算了,按实际情况。
如果你不了解如何新建项目,请参阅***链接停止解析***。

第2步 打开App.xaml下的App.xaml.cs。

第3步 将光标移到这行代码(应该是第40行)[mw_shl_code=csharp,true]protected override void OnLaunched(LaunchActivatedEventArgs e)[/mw_shl_code]这一部分表示点开App就会执行的代码。

第4步 我们希望在打开应用的时候,就开始播放音频。因此,在大括号后面插入一行,输入[mw_shl_code=csharp,true]MediaPlayer player = new MediaPlayer();[/mw_shl_code]这时候Visual Studio应该就会提示错误了。没错,我们第一课的第一行代码就出错了。
接下来,你应该会留意到Visual Studio会在附近出现灯泡提示。对于新手而言,灯泡是一个很重要的工具,要善于利用它。

第5步 点击灯泡,选择[mw_shl_code=csharp,true]using Windows.Media.Playback;[/mw_shl_code]

第6步 输入[mw_shl_code=csharp,true]player.Source = MediaSource.CreateFromUri(new Uri("http://ngcdn003.cnr.cn/live/yyzs48/index.m3u8"));
player.Play();[/mw_shl_code]鼠标指向MediaSource,Visual Studio会出现灯泡,类似第5步处理。

第7步 点击工具栏上的“本地计算机”。你的第一个播放软件就完成了!
以后进行到任何你认为重要的步骤,你都可以点“本地计算机”来测试。课程不会再提醒。(当然,如果你连接手机,可以把x86改为ARM,然后把“本地计算机”改为“Device”。)[page]专题一 开发一个媒体播放应用
课题1 开发一个非常简陋的播放应用

我们刚刚做了什么?

我们刚刚写了三行代码,第一行,初始化MediaPlayer的新实例,也就是说,新建了一个播放器;第二行,把这个播放器的播放源设置为音乐之声;第三行,使这个播放器开始播放。

但是,我们这节课还有很久才下课,那么我讲些什么好呢?

***附件停止解析***

我们留意到,“new”的下面有三个点。用鼠标点击,这一行的左侧又出现了灯泡。我们按灯泡说的做。

现在你的代码看起来应该像这样:[mw_shl_code=csharp,true]MediaPlayer player = new MediaPlayer()
{
Source = MediaSource.CreateFromUri(new Uri("http://ngcdn003.cnr.cn/live/yyzs48/index.m3u8"))
};
player.Play();[/mw_shl_code]如果你了解了C#的语法,那么你应该知道,之前的代码的第二行,其实是给player.Source赋值。当初始化(new)和赋值(=)的代码在一起时,可以把赋值的代码放在初始化的代码里面。(这种格式在自适应磁贴和自适应通知会大量涉及。)此时,要注意,大括号里面只能放赋值的代码,并且用逗号而不是分号来分隔。

player里面还有哪些可以赋值?你可以在这行代码[mw_shl_code=csharp,true]Source = MediaSource.CreateFromUri(new Uri("http://ngcdn003.cnr.cn/live/yyzs48/index.m3u8"))[/mw_shl_code]的后面添加一个逗号,按回车,按a,按退格键。Visual Studio会展示许多可以赋值的项。

***附件停止解析***

图中,get;表示可读取,set;表示可写入(可以赋值)。在new的代码里面,这些项目都是可以写入的,因为不能set;的都已经被过滤掉了。
你可以试试更改Volume,IsMuted等等。你也可以试试更改我们刚刚输入的地址***链接停止解析***。[page]专题一 开发一个媒体播放应用
课题1 开发一个非常简陋的播放应用

微软给后台播放又作了一次代码简化。现在,打开Package.appxmanifest,点击“功能”,勾选“背景媒体播放”。现在,你的应用就可以在后台播放了。后台音频播放(单进程)的全部内容就是本页,该内容的教学到此为止。[page]专题一 开发一个媒体播放应用
课题1 开发一个非常简陋的播放应用

只要你开始写程序,你就应该知道,Bug是不能避免的。我们刚刚写的程序有一个Bug,你发现了吗?

我们在前面提过,“这一部分表示点开App就会执行的代码”,“点开”的内涵十分丰富。在本案例中,它主要表示点击此应用的磁贴或者应用列表中对应的程序。只要点一次,应用就会新建一个播放器并播放音乐之声,不论应用是不是本来就正在运行。在手机上你可能没什么感觉,但在电脑上,允许多个后台播放器的情况下,这个状况就显得有点糟糕了。

那么,我们给刚刚的代码用if来“包装”一下:[mw_shl_code=csharp,true] if (e.PreviousExecutionState != ApplicationExecutionState.Running && e.PreviousExecutionState != ApplicationExecutionState.Suspended)
{
MediaPlayer player = new MediaPlayer()
{
Source = MediaSource.CreateFromUri(new Uri("http://ngcdn003.cnr.cn/live/yyzs48/index.m3u8"))
};
player.Play();
}[/mw_shl_code]if里面的条件使应用仅在启动时播放音频。PreviousExecutionState表示点开应用之前应用的状态:Running表示正在运行,Suspended表示已挂起。在Visual Studio中,你可以用鼠标选中ApplicationExecutionState后面的“.”,然后再次输入“.”,就可以了解剩下的三项是什么。

但即便如此,还是可能有潜在的Bug。“点开”还有一层含义:预启动。Windows 10引入了预启动机制,当Windows发现用户经常使用某应用的时候,会在后台偷偷地启动这个应用。如果这个应用在预启动的时候突然开始播放音乐之声,会吓用户一跳,因为用户自己并没有打开它。

虽然,在Windows 10 1607和1703中,开发者必须手动允许应用预启动,但在Windows 10 1511中,所有UWP应用都可以预启动。谁知道Windows 10 1709会怎么样呢?我们需要修复这个潜在的Bug,一方面是防止微软做些什么,一方面是给我们后续课程作准备。我们可以把if后面的条件改为:[mw_shl_code=csharp,true]e.PreviousExecutionState != ApplicationExecutionState.Running && e.PreviousExecutionState != ApplicationExecutionState.Suspended && e.PrelaunchActivated==false[/mw_shl_code]即使如此,还是不尽如人意。假设这款应用被预启动了,没有播放音频,当用户点击启动应用的时候,由于e.PreviousExecutionState不符合要求(状态为Running),又没有播放音频,这就不符合要求了。应该怎么办呢?

Debug是一个很痛苦的过程。但同时,它又能训练你的逻辑思维。别看应用很简单,但是,要做好,一点都不简单。此为匠心所在。

下节课:2017年7月12日 19:00。届时公布答案。

[backcolor=red]请投票选择第一个“打卡签到”,谢谢。[/backcolor]

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
哈工程贾硕 UID.853311
2017-07-09 回复

顶。。。。

FZ370 UID.2866640
2017-07-09 使用 Lumia 640 XL 回复

mark一下

中****棍 UID.2885929
2017-07-09 使用 Lumia 1520 回复

想当年我高中毕业基情满满报考的东北师范大学软件技术专业 学了四年愣是没学会 SQL C# C++ .net android 网页制作 等等愣是没学会 我现在都好奇我当初是怎么毕业的 可能我英语太烂了 现在只有靠CADPS平面设计为生

木易巅峰 UID.1253182
2017-07-09 使用 Lumia 638 回复

好帖,顶一下

zcxsythenew UID.911687
2017-07-09 回复

本帖最后由 zcxsythenew 于 2017-7-10 10:49 编辑

Quote中华小神棍 发表于 2017-7-9 21:43
想当年我高中毕业基情满满报考的东北师范大学软件技术专业 学了四年愣是没学会 SQL C# C++ .net android ...


这一行要坚持不容易。
报名“我要上课”的有60人;其中签到的有10个。

1252 UID.119415
2017-07-09 回复

顶一下~

搖****茫 UID.2852967
2017-07-09 使用 Lumia 950 XL 回复

拍拍手,谢谢你!

中****棍 UID.2885929
2017-07-09 使用 Lumia 1520 回复

Quotezcxsythenew 发表于 2017-7-9 21:56
这一行要坚持不容易。今天0点半左右发的贴,报名“我要上课”的有57人;现在这篇帖子,报了名的人当中来 ...


楼主 说句实在话 这个对英语水平要求太高了 我实在不行

zcxsythenew UID.911687
2017-07-09 回复

Quote中华小神棍 发表于 2017-7-9 22:58
楼主 说句实在话 这个对英语水平要求太高了 我实在不行


我感觉还好吧,一方面Visual Studio已经在很多地方汉化并给了中文提示,一方面msdn(现MS Docs)上的文档都有很多地方是中文的。

不过,也确实,也许只有像我这种准大一的有那么多闲时来搞这些。大家都要上班,压力山大。但另一方面,时间就像海绵里的水。

3517277 UID.13183
2017-07-10 回复

上网易云课堂或者腾讯课堂上免费公开课吧,人生已经这么难了,还要看这么多文字描述的代码。Hold不住呀。

第一颗苹果 UID.1327559
2017-07-10 使用 Lumia 640 回复

感觉是授人以鱼

小张qq UID.1257492
2017-07-10 使用 Lumia 640 XL 回复

支持下

zcxsythenew UID.911687
2017-07-10 回复

Quote第一颗苹果 发表于 2017-7-10 02:04
感觉是授人以鱼


如果真是授人以鱼,我一页之内就可以写完。

zcxsythenew UID.911687
2017-07-10 回复

Quote3517277 发表于 2017-7-10 00:08
上网易云课堂或者腾讯课堂上免费公开课吧,人生已经这么难了,还要看这么多文字描述的代码。Hold不住呀。 ...


我不会做视频(换句话说,是我视频做不好),必定是照本宣科把这篇帖子里的话都读上去。那不如直接以文本形式呈现好了。 其实这篇文章就是四行代码(不计大括号),只不过解释的内容比较多罢了。 我就是希望写一些与论坛内已有文章的文风不一样的文章,虽然有时候另类就等于灭亡。

權少 UID.1362110
2017-07-10 使用 Lumia 950 回复

支持個,論壇就應該多點技術少點撕逼帖

vbfool UID.352791
2017-07-10 回复

现在这个社会,“授人以渔,不如送人西湖醋鱼”。

zcxsythenew UID.911687
2017-07-10 回复

Quotevbfool 发表于 2017-7-10 21:08
现在这个社会,“授人以渔,不如送人西湖醋鱼”。


这应该是正常现象,首先这本来就比较难学;其次不论何种教程,都是“不会的看不懂,已会的不用看”,这就是尴尬之处。

看论坛里面的各种趋势,《一.学习入门(新建项目)》查看数3k,收藏数45;到了第二讲要学xaml属性,人气暴跌,查看数700,收藏数6。Clever-he的UWP开发资料收集,查看12k,收藏74;然而他的其它真正有内容的帖子远没有这样的人气。

懒惰是人的本性,我也不是求别的什么,不过是假装智机网好像有很多人看一样,鞭策自己学习罢了。大有把智机网当做我的日记本之意(其实我根本没有日记本)。

Ma****ip UID.2832563
2017-07-10 回复

Quotezcxsythenew 发表于 2017-7-10 21:32
这应该是正常现象,首先这本来就比较难学;其次不论何种教程,都是“不会的看不懂,已会的不用看”,这就 ...


赞同你的说法,如果说GitHub是纽约,StackOverflow是洛杉矶,CNDS是上海的话,这里恐怕连抚顺都算不上.想在这里找几个能把代码看完的人恐怕都很难.记得B站上Bob Tabor的UWP教学视频,头20集弹幕还有20+,到最后也就2-3条了.不过还是要支持你!!

zcxsythenew UID.911687
2017-07-10 回复

QuoteMadship 发表于 2017-7-10 22:09
赞同你的说法,如果说GitHub是纽约,StackOverflow是洛杉矶,CNDS是上海的话,这里恐怕连抚顺都算不上.想在这 ...


CNDS指的是CSDN吗?

Ma****ip UID.2832563
2017-07-10 回复

Quotezcxsythenew 发表于 2017-7-10 22:31
CNDS指的是CSDN吗?


haha ~~~{:6_229:}{:6_229:}{:6_229:}

player2135 UID.664133
2017-07-10 回复

赞一个!

第一颗苹果 UID.1327559
2017-07-11 使用 Lumia 640 回复

我的意思是看着照做没问题,但是离开了就完全手足无措不知道该怎么做了

vbfool UID.352791
2017-07-11 回复

Quote***链接停止解析***
我的意思是看着照做没问题,但是离开了就完全手足无措不知道该怎么做了


如果完全离开之后还能轻松做的出来的,恭喜你,你已经是一个职业的程序员了。

湖****海 UID.2870230
2017-07-17 使用 Lumia 640 回复

vs2017和2015差别大吗?怎么才能把2015升到2017?

zcxsythenew UID.911687
2017-07-17 回复

Quote湖陆海 发表于 2017-7-17 08:55
vs2017和2015差别大吗?怎么才能把2015升到2017?


好像不行。你可以先卸载,再安装。

大明二代 UID.1149444
2017-07-22 使用 Lumia 638 回复

https://github.com/damingerdai/MusicPlayer/,谢谢,这是我写的一个非常简单的音乐播放器,不想更新了

zcxsythenew UID.911687
2017-07-22 回复

本帖最后由 zcxsythenew 于 2017-7-22 15:21 编辑

Quote大明二代 发表于 2017-7-22 15:00
https://github.com/damingerdai/MusicPlayer/,谢谢,这是我写的一个非常简单的音乐播放器,不想更新了 ...


你的目的是什么?

yc****56 UID.2805753
2017-07-24 回复

朋友,请问贴的那个音乐链接有要求吗?换成一个网易云的一点反应都没有?

zcxsythenew UID.911687
2017-07-24 回复

Quoteyc5256 发表于 2017-7-24 19:09
朋友,请问贴的那个音乐链接有要求吗?换成一个网易云的一点反应都没有? ...


具体是什么链接?

yc****56 UID.2805753
2017-07-25 使用 Lumia 1520 回复

Quotezcxsythenew 发表于 2017-7-24 20:23
具体是什么链接?


额,不好意思,之前在外面,没看到消息。链接http://music.163.com/m/song?id=477215840&userid=268766281 就这个

zcxsythenew UID.911687
2017-07-25 回复

Quoteyc5256 发表于 2017-7-25 00:13
额,不好意思,之前在外面,没看到消息。链接http://music.163.com/m/song?id=477215840&userid=26876628 ...


用于媒体播放源的地址不能是一个网页,必须直接指向播放文件,就是可以直接把链接放到迅雷里面下载的这种。

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报