手机E680同时播放两个音乐完美解决方案-真!

国庆这几天把我之前C#写的俄罗斯方块移植到了我的E680上,使用的是Moto的J2me开发包,在声音的播放方面遇到了不少奇奇怪怪的问题:

1.声音时有时无,有时长时间没有问题,突然没有了声音,再也不出声了.

2.延时时长时短.

3.第三个Player无法出声.

找了一下网上,发现这些都是手机的通病和老大难,而且每个厂家的实现都不一样,解决方案也不同。

发现有人在blog上说:

根据MOTO的一些资料显示,在MOTO手机中播放声音有下面几条约束:

除了同时播放一个MIDI和一个WAV以外,MOTO手机无法同时播放多个声音,而且必须是先播放MIDI然后播放WAV

另外还给出了所谓的完美解决方案和源代码,    http://blog.csdn.net/linyu/archive/2005/11/17/531472.aspx

我很高兴,复制下来用了一下, 发现根本不能解决,并且那段代码不停地加载声音文件,延时更严重了,效果反应更差了.

于是到MOTODEV下了手册E680_Developer_Guide.pdf,E680_Media_Guide.pdft和E680_A780_SoundIssues.pdf看了一番,发现e680的情况没有上面那位仁兄说的那样严重,找到声音混合表,发现

1.如果两个wav文件的采样频率一致的话,是可以同时混合播放的.

2.所有的Midi可以和除了Video w/audio 外的声音格式混合,但不能两个midi混合

3. Player 数量要<=4 

4.  MIDI 的大小要小于 150K

虽然Player的数量可以有4个,但是我的测试结果是,如果同时创建了两个以上,只有前两个播放声音是正常的,后面的两个根本不能发声。

我要达到的目的也就是很多人在问的,并且感到犯难的:

 

1--同时播放俄罗斯民歌的同时可以播放一些游戏过程中特效声音,

2---同时保证声音播放的延时足够短.

 

我的解决方案如下:

1.使用CoolEdit把特效和背景音乐都转为采样频率一致的PCM编码的Wav文件.

2.所有的特效声音放在同一个Wav文件中,背景音乐单独一个文件,这样就保证只需要两个Player就可以了,这样两个Player可以在开始的时候realize()和prefecthed()一次就可以了,避免重复读取wav文件,大大减少延时.

3.通过Player.SetMediaTime和Player.Stop来控制播放指定的特效,另个这里测试发现,SetMediaTime如果参数时间是0,SetMediaTime返回一个负数.SetMediaTime的参数如果大于11.64秒的话,SetMediaTime实际只能设置11.64,不过如果是>11.64的话,还可以在player的Started事件触发再设置一次,这时就可以把时间设置你想要的(这个应该是和Player预加载时间长短有关),但是如果是0的话,就无论怎么设置都是返回一个负数,并且实际播放的时候也确实延时了,所以这里我不把第一个声音的位置放在0位置,而是放在开始500毫秒处,同时把所有的特效的开始位置控制在11秒之前, 同时为了防止停止的时候不准确造成误播其它特效声音,每段特效声音之前预留一些空白.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值