【问题标题】:Android 2.2 cutting off MediaPlayer sound playback?Android 2.2 切断 MediaPlayer 声音播放?
【发布时间】:2011-08-17 19:01:16
【问题描述】:

经过一番谷歌搜索,这似乎是一个常见问题,但我还没有找到实际的解决方案。我尚未在实际设备上进行测试,但模拟器在完成大约 80% 时会切断我的声音片段。我正在播放 .wav 文件。

有人知道这些问题的编程解决方案吗?

编辑:

    public void play(Context context){
    if (soundPlayer != null){
        soundPlayer.release();
    }

    int rId = 0;

    switch(aIndex){
        case 0: rId = R.raw.c0; break;
        case 1: rId = R.raw.c1; break;
        case 2: rId = R.raw.c2; break;
        case 3: rId = R.raw.c3; break;
        case 4: rId = R.raw.c4; break;
        case 5: rId = R.raw.c5; break;
        case 6: rId = R.raw.c6; break;
        case 7: rId = R.raw.c7; break;
        case 8: rId = R.raw.c8; break;
        case 9: rId = R.raw.c9; break;
        case 10: rId = R.raw.c10; break;
        case 11: rId = R.raw.c11; break;
        case 12: rId = R.raw.c12; break;
        case 13: rId = R.raw.c13; break;
        case 14: rId = R.raw.v14; break;
        case 15: rId = R.raw.v15; break;
        case 16: rId = R.raw.v16; break;
        case 17: rId = R.raw.v17; break;
        case 18: rId = R.raw.v18; break;
        case 19: rId = R.raw.v19; break;
        case 20: rId = R.raw.v20; break;
        case 21: rId = R.raw.v21; break;
        case 22: rId = R.raw.v22; break;
        case 23: rId = R.raw.v23; break;

        default: rId = R.raw.error; break;
    }

    soundPlayer = MediaPlayer.create(context, rId);
    if (soundPlayer != null){
        soundPlayer.start();
    }
}

【问题讨论】:

  • 粘贴使用MediaPlayer 的代码。没有它就很难提供帮助。
  • 并不复杂什么的,就是被截断了。
  • 在相信模拟器之前我会在真机上测试
  • 我没有运行 2.2 的真实设备。如果有人想试一试,对我来说,如果允许的话,我可以提供一个链接吗?
  • 这些声音到底有多长? “80%”会剩下大约 0.5 秒的播放时间吗?

标签: android media-player android-2.2-froyo


【解决方案1】:

遇到同样的问题后才发现这个问题。就我而言,简单的答案是使MediaPlayer 成为类变量。如果您将其设为本地方法,垃圾收集器显然会将其清扫并终止声音播放。

【讨论】:

    【解决方案2】:

    首先,我会尝试确保在start() 之前调用MediaPlayer.create() 函数。如果是游戏,则在开始新游戏时加载声音(为每个声音创建一个新的媒体播放器)。原因是create 函数将有效地在那里加载声音文件,然后在您调用start 时准备好流畅播放。如果您每次都在运行之前加载该文件,那么您不仅做的工作超出了您的需要,而且可能对模拟器产生不良影响。我不确定你是否注意到,但与几乎任何实际的物理设备相比,模拟器并不是最快的工具。结果,我认为可能发生的情况是模拟器正在“播放”声音,并认为它在声音实际播放之前就已经完成,主要是由于模拟器的速度慢。

    在实际设备上试用一下,我认为您不会有任何问题。

    【讨论】:

    • 谢谢,我想这会有所帮助。您是否推荐在 MediaPlayer 对象数组上使用 SoundPool?
    • 视情况而定。从技术上讲,两者都不比另一个更好。一般来说,MediaPlayer 用于较长的声音(想想背景音乐),SoundPool 用于声音效果(点击、枪声等)。每种类型也有一些技术限制。 MediaPlayer 授予查看声音是否正在播放的能力,而 SoundPool 则没有。但是,SoundPool 可以轻松设置最大声音数,并允许同时播放多次相同的声音(加载一次),除非您制作大量相同声音的 MediaPlayer,否则 MediaPlayer 无法做到这一点。
    • 我最近在真实设备上遇到了同样的问题。 stackoverflow.com/questions/48667840/… 但是这个问题只能通过提高速度来重现。
    【解决方案3】:

    我认为您需要在开始之前进行发布...示例

        if( mPlayer!= null ) mPlayer.release();
    
         mPlayer = MediaPlayer.create(this, listaMP3[contador]);
         mPlayer.start();             
    

    【讨论】:

    • 谢谢——我在方法的顶部做了发布。但它仍然会导致中断。
    【解决方案4】:

    出于某些原因,如果我在我用来播放歌曲的方法之外定义 mediaPlayer,它可以工作。

    虽然我只调用了一次 playSong() 方法;

      mediaPlayer = MediaPlayer.create(mContext, R.raw.overworld);
            mediaPlayer.setVolume(musicVolume, musicVolume);
    
      playSong();
    

    playSong 方法:

       private void playSong() {
    
        if (!mediaPlayer.isPlaying())
                    mediaPlayer.start(); // no need to call prepare(); create() does that for you
    } 
    

    【讨论】:

    • 我也有同样的行为。我的猜测是,由于start() 没有阻塞,因此方法退出并且 MediaPlayer 引用被破坏,并且对象可能被 GC 拾取。任何人都可以评论我的猜测吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多