android – Mediaplayer切断声音太快了

android – Mediaplayer切断声音太快了,第1张

概述我有两个设备可以测试我的游戏:美国Celluar手机(SCH-R880)和Kindle Fire,Kindle Fire比手机强大得多. 我有几个短(少于或约1秒)的声音效果.为了节省内存,我加载,播放和释放一些这些音效.在电话里,他们玩(主要是)按预期.然而,在Kindle Fire上,它们被缩小.真的很短的声音被切断,所以我没有听到任何声音.然而,在安装过程中加载并保留的那些播放正常. 任何人 我有两个设备可以测试我的游戏:美国Celluar手机(SCH-R880)和Kindle Fire,Kindle Fire比手机强大得多.

我有几个短(少于或约1秒)的声音效果.为了节省内存,我加载,播放和释放一些这些音效.在电话里,他们玩(主要是)按预期.然而,在Kindle Fire上,它们被缩小.真的很短的声音被切断,所以我没有听到任何声音.然而,在安装过程中加载并保留的那些播放正常.

任何人都知道这里发生了什么我是否以某种方式释放我的媒体呢?下面是一个例子.在电话里我听到“二级”!但是在Kindle上,我听到像“Lev tw”这样的东西.

mpNum = null;try{    switch (level)    {        case 2:            mpNum = MediaPlayer.create(contxt,R.raw.l2); break;        case 3:            mpNum = MediaPlayer.create(contxt,R.raw.l3); break;        case 4:            mpNum = MediaPlayer.create(contxt,R.raw.l4); break;        case 5:            mpNum = MediaPlayer.create(contxt,R.raw.l5); break;        case 6:            mpNum = MediaPlayer.create(contxt,R.raw.l6); break;        case 7:            mpNum = MediaPlayer.create(contxt,R.raw.l7); break;        case 8:            mpNum = MediaPlayer.create(contxt,R.raw.l8); break;        default:            return;    }    MediaPlayer vLevel = MediaPlayer.create(contxt,R.raw.level);    vLevel.setonPreparedListener(new MediaPlayer.OnPreparedListener()    {        public voID onPrepared(MediaPlayer mp)        {            mp.start();        }    });    vLevel.setonCompletionListener(new MediaPlayer.OnCompletionListener()    {           public voID onCompletion(MediaPlayer mpl)           {            mpNum.start();            mpl.release();           }       });        mpNum.setonCompletionListener(new MediaPlayer.OnCompletionListener()        {            public voID onCompletion(MediaPlayer mp)            {                mp.release();            }        });    }    catch (Exception e) {}

为了试图解决这个问题,我尝试了SoundPool,但是它不起作用;我什么也听不到以下是我用SoundPool尝试播放音乐的功能:

SoundPool soundPool = new SoundPool(1,AudioManager.STREAM_MUSIC,100);    soundPool.load(contxt,R.raw.song2,1);    AudioManager mgr = (AudioManager)contxt.getSystemService(Context.AUdio_SERVICE);    float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);    float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);    float volume =  streamVolumeMax;      soundPool.play(1,volume,1,5,2);

UPDATE

我注意到应该播放的声音(但不是)出现了这个错误:

AudioPolicyManager: stopOutput() oldDevice 2AudioPolicyManager: [getDeviceForStrategy] strategy : 0,forceUse(0)
解决方法 我有同样的问题,这确实是一个垃圾收集器的问题!如果您将媒体播放器的实例分配给方法中的某些局部变量,则在离开该方法后该实例不再存在,因此GC可以随时删除它.

为了避免这种情况,您需要至少保留一个指向其他地方的实例的指针.我创建了一个静态集来保持所有的指针,它看起来像这样:

private static Set<MediaPlayer> activePlayers = new HashSet<MediaPlayer>();

然后创建媒体播放器如下:

MediaPlayer player = MediaPlayer.create(context,context.getResources().getIDentifIEr(ID,"raw",pkg));activePlayers.add(player);player.setonCompletionListener(releaSEOnFinishListener);player.start();

其中releaSEOnFinishListener是一个监听器,可以像您一样完成释放媒体播放器,但也可以从activePlayers集中删除指针:

MediaPlayer.OnCompletionListener releaSEOnFinishListener = new MediaPlayer.OnCompletionListener() {    public voID onCompletion(MediaPlayer mp) {        mp.release();        activePlayers.remove(mp);    }};

我希望这可以帮助你.

总结

以上是内存溢出为你收集整理的android – Mediaplayer切断声音太快了全部内容,希望文章能够帮你解决android – Mediaplayer切断声音太快了所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1133798.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存