预加载音效

时间:2011-07-18 19:21:14

标签: android audio preload

我让计数器正常工作(感谢您的帮助)我使用MediaPlayer添加声音,问题是加载计数器有延迟,因为声音加载在同一个类上。

有没有办法使用主类预加载声音,那么,当调用计数器时,数字是缓冲的并且可以从这个类中调用?

应用程序有一个启动画面,唯一的目的是加载其他类所需的任何内容以避免延迟。

如果无法从其他课程加载声音,是否可以在播放时单独加载?

这就是我到目前为止......

final boolean sound = timer_sound.getBoolean("timer_sound", true);

  final MediaPlayer number01 = MediaPlayer.create(this, R.raw.number_1);
  final MediaPlayer number02 = MediaPlayer.create(this, R.raw.number_2);
  final MediaPlayer number03 = MediaPlayer.create(this, R.raw.number_3);
  final MediaPlayer number04 = MediaPlayer.create(this, R.raw.number_4);
  final MediaPlayer number05 = MediaPlayer.create(this, R.raw.number_5);
  final MediaPlayer number06 = MediaPlayer.create(this, R.raw.number_6);
  final MediaPlayer number07 = MediaPlayer.create(this, R.raw.number_7);
  final MediaPlayer number08 = MediaPlayer.create(this, R.raw.number_8);
  final MediaPlayer number09 = MediaPlayer.create(this, R.raw.number_9);
  final MediaPlayer number10 = MediaPlayer.create(this, R.raw.number_10);
  final MediaPlayer number15 = MediaPlayer.create(this, R.raw.number_15);
  final MediaPlayer number20 = MediaPlayer.create(this, R.raw.number_20);

lastSeconds = (TextView) findViewById(R.id.lastminuteseconds);

lastMinute = new CountDownTimer(60 * 1000, 1000) {

  public void onTick(long secondsToStart) {
    int elapseTime = (int) (secondsToStart / 1000);

    if (sound == true){
      switch(elapseTime) {
        case 1: number01.start();break;
        case 2: number02.start();break;
        case 3: number03.start();break;
        case 4: number04.start();break;
        case 5: number05.start();break;
        case 6: number06.start();break;
        case 7: number07.start();break;
        case 8: number08.start();break;
        case 9: number09.start();break;
        case 10: number10.start();break;
        case 15: number15.start();break;
        case 20: number20.start();break;
      }
    }

这工作得很好,问题是加载文件有2秒的延迟,我想添加更多(50,40,30)。

2 个答案:

答案 0 :(得分:0)

你的做法似乎非常浪费。您应该加载第一个声音,并在播放时触发下一个声音的加载,因此在任何时候您只缓存RAM中的两个声音(当前和下一个)。

因此,您只预加载第一个声音,然后在ontick()中通过run()播放当前声音时触发下一个声音的加载,并将声音对象交换为下一个ontick()。

答案 1 :(得分:0)

我正在慢慢学习,我已经想到了这一点。

我无法相信这样做有多简单....

不要输入所有代码,这里是完成的更改;

首先,我停止用开关加载声音,但是我使用了开关调用类......

  if (sound == true){
    switch(elapseTime) {
      case 1: number01();break;
      case 2: number02();break;

然后,我在调用类时加载声音;

 public void number01(){
   final MediaPlayer number01 = MediaPlayer.create(this, R.raw.number_1);
     number01.start();
   }
 public void number02(){
    final MediaPlayer number02 = MediaPlayer.create(this, R.raw.number_2);
    number02.start();
 }

现在,当调用开关并加载声音并播放它时。这样可以在加载应用程序时停止延迟。

我希望这有助于其他初学者,就像我一样,通过犯错并纠正错误来学习。