博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于WP7上音乐播放的嫉妒恶心的一些规则和解决方案。
阅读量:5105 次
发布时间:2019-06-13

本文共 2323 字,大约阅读时间需要 7 分钟。

之前一篇文章是简略的说了一下,解决用户音乐和应用(或者游戏)音乐冲突的问题,现在我们来一起研究下,如何巧妙地规避微软的规则禁区,然后合理的玩出自己想要的效果。

我先简短的介绍下,在WP上播放背景音乐有2中方法:

1.调用Microsoft.Xna.Framework.Media下的MediaPlayer.Play()方法。实例代码:

1      Song bgs = Song.FromUri("background", new Uri("Sound/坑爹的背景音乐.mp3",UriKind.Relative)); 2                 FrameworkDispatcher.Update(); 3 4                 MediaPlayer.Play(bgs);

这个方法在当前mango版本能播放种类比较多的音乐文件,据我自己使用的经历,一般.mp3和.wav文件居多,而正好这个方法正好使用起来比较灵活,他有很多可供调用的其他方法。操作起来比较方便,总的来说,表面上看这个方法真的是很好,但是,但是。。。。。。接下来就是最坑爹的事情发生了,这个MediaPlayer和手机里面集成的Zune播放器是共用进程的,坑爹啊!有木有啊!也就是说用户如果是先打开Zune播放器,比如用户先打开手机自带的Zune播放器,播放了一首优美的,有格调的《月XX上》,然后在进入你的游戏(或者应用),然后如果这个时候你如果用这个播放你的背景音乐,那么用户正在播放的音乐会先被停止,可是这一点微软是不允许的,所以我在前一篇博客就先提示了,我们必须先弹出对话框,来问用户,那么好,就算如此做了,还是有一个我们团队曾经遇到的问题,那就是微软有些审核人员(不要认为审核人员都是有一个统一的标准,据我们猜测这个审核估计都是不同的人审核,所以会有不同的标准,虽然大致是一样。。但是总有些非主流)会认为你这样终止了用户的音乐,等到用户退出你的游戏之后,你得复原用户进入你游戏之前的播放音乐的状态,但是就因为这个MediaPlayer是单线条的死脑筋 = =!当你用这个来播放你的背景音乐之后,是根本无法复原到进入你的游戏(或者应用)之前的那首歌,和那个状态。。。简而言之,就是MediaPlayer的播放源文件只有一个,你在代码里面调用和Zune播放器是公用一个系统进程(况且就这么解释吧。。),它只能有一个正在播放的音乐文件。所以,敬告:当提前得知你无需在关闭你的游戏之后去恢复Zune播放器的用户音乐,你可以大胆地使用这个方法, 因为他是标准的播放.MP3文件的首选。

2.调用 Microsoft.Xna.Framework.Audio下的SoundEffect.Play()方法。实例代码:

1Stream stream = TitleContainer.OpenStream("Sound/坑爹的背景音乐.wav");
2             SoundEffect effect = SoundEffect.FromStream(stream); 3             FrameworkDispatcher.Update(); 4             effect.Play();

注意:这个soundeffect是从XNA里面来的,有过XBOX编程经验的大神们不会陌生,他目前只能播放.WAV文件,据内部消息,tango版本之后soundeffect可以播放mp3文件了,这是后话,就目前的形式来说,这个方法不被推荐,甚至在官方规则里面都是禁止,,但是根据经验,审查人员不会查看代码,他们只要一旦听到你的游戏音乐跟用户Zune音乐出现混杂的时候,就会第一时间知道你是用了soundeffect来播放背景音乐,因为MediaPlayer不可能同时播放2个音乐(原因前面说过了。。。)。所以利用这一点规则黑洞,我们可以用soundeffcet来播放背景音乐,又可以很好的保存用户进入游戏之前的那个音乐(因为我们根本没对MediaPlayer做任何毁灭性操作,就算你调用了MediaPlayer.Pasue(),也没关系,在游戏即将退出的时候,你显式地调用一下MediaPlayer.Resume()就行了,哇哈哈哈!)

另外,我推荐SoundEffectInstance这个类来播放音乐,因为他有类似于MediaPlayer那些Pause ,Resume等操作,SoundEffect类可以生出SoundEffectInstance这个“儿子”,具体代码如下:

1 Stream stream = TitleContainer.OpenStream(route); 2             SoundEffect effect = SoundEffect.FromStream(stream); 3             FrameworkDispatcher.Update(); 4             SoundEffectInstance sfi = effect.CreateInstance(); 5             sfi.Play();

所以,总结一下,如果你的游戏无需恢复用户的音乐,那么请使用MediaPlayer,这是官方推荐的,如果你想做的稍微完美一点,去恢复用户的音乐的话,请使用SoundEffectInstance。

 

转载于:https://www.cnblogs.com/FreeWingInSky/archive/2012/02/20/2352394.html

你可能感兴趣的文章
cdqz2017-test10-rehearsal(CDQ分治&可持久化线段树&单调栈)
查看>>
opengl离屏渲染(不需要和窗口绑定,仅当作一个可以渲染一张图片的API使用)+ opencv显示...
查看>>
request的响应时间elapsed和超时timeout
查看>>
javascript的字符串大小比较
查看>>
大型网站的 HTTPS 实践(一)—— HTTPS 协议和原理(转)
查看>>
【洛谷P1558】色板游戏
查看>>
程序猿修仙之路--算法之快速排序到底有多快
查看>>
HTTP代理实现请求报文的拦截与篡改9--实现篡改功能后的演示+源码下载
查看>>
Linux常用命令与操作
查看>>
thinkphp5 composer安装验证码
查看>>
Eclipse中最常用的热键
查看>>
PL/SQL恢复默认窗口样式
查看>>
IOS--UISwitch的使用方法
查看>>
VC6工具下查看反汇编代码、机器码的使用技巧
查看>>
LeeTCode题解之Remove Duplicates from Sorted List
查看>>
Silverlight多线程技术Thread的应用
查看>>
前端知识点回顾之重点篇——CSS中vertical align属性
查看>>
我的软件终于被发布了!
查看>>
HDU_1004 Let the Balloon Rise
查看>>
SQLCLR(一)入门
查看>>