关于WP7上音乐播放的嫉妒恶心的一些规则和解决方案。

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

我先简短的介绍下,在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文件了,这是后话,就目前的形式来说,这个方法不被推荐,甚至在官方规则里面都是禁止,详情请点击http://msdn.microsoft.com/en-us/library/hh184838(v=VS.92).aspx,但是根据经验,审查人员不会查看代码,他们只要一旦听到你的游戏音乐跟用户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。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值