2012-04-16 45 views
0

问题我试图使用SoundManager随机播放30秒的声音,同时启动由onTouch事件触发的动画序列(闪烁图形)。无论出于何种原因,在播放约5秒钟后,声音会被剪切掉,我无法弄清楚原因。有什么想法吗?声音管理器播放随机文件

同样在测试之后,似乎只有在最初的onTouch事件发生后一分钟左右才会播放。

public class Soundboard extends Activity { 
    private SoundManager mSoundManager; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     mSoundManager = new SoundManager(); 
     mSoundManager.initSounds(getBaseContext()); 
     mSoundManager.addSound(0, R.raw.sound0); 
     mSoundManager.addSound(1, R.raw.sound1); 
     mSoundManager.addSound(2, R.raw.sound2); 
     mSoundManager.addSound(3, R.raw.sound3); 
    }; 

    public boolean onTouchEvent(MotionEvent evt){ 

     Random r = new Random(); 
     int x = r.nextInt(3); 

     switch (evt.getAction()) 
     { 
      case MotionEvent.ACTION_DOWN: 
      mSoundManager.playSound(x); 
      startAnimating(); 
      return super.onTouchEvent(evt); 

      case MotionEvent.ACTION_UP: 
      break; 
      default: 
      break; 
     } 
     return true; 
    } 

    private void startAnimating() { 

     ImageView wiub_screen01 = (ImageView) findViewById(R.id.wiub_screen01); 
     Animation fadein01 = AnimationUtils.loadAnimation(this, R.anim.fade_in01); 
     wiub_screen01.startAnimation(fadein01); 

     ImageView wiub_screen00 = (ImageView) findViewById(R.id.wiub_screen00); 
     Animation fadein00 = AnimationUtils.loadAnimation(this, R.anim.fade_in00); 
     wiub_screen00.startAnimation(fadein00); 
    } 

}

+0

你试图播放的文件格式是什么? – MahdeTo 2012-04-16 04:57:20

+0

所有文件都是mp3格式。 – n00bdev 2012-04-16 05:04:29

回答

0

有一个很好的机会,音频尚未加载。如果你真的想播放一些短片,那么一定要看看SoundPool。 (来自谷歌的Soundpool实施例改编)

尝试这种情况:

public class Soundboard extends Activity { 
    private SoundPool mSoundPool; 
    boolean loaded = false; 
    private int[] soundIDs; 
    private int[] resIDs; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); 
     mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
      @Override 
      public void onLoadComplete(SoundPool soundPool, int sampleId, 
          int status) { 
        loaded = true; 
      } 
     }); 
     resIDs = new int[]{R.raw.sound0,R.raw.sound1,R.raw.sound2.R.raw.sound3 }; 

     for(int i=0; i<resIDs.length; i++){ 
      soundIDs[i] = mSoundPool.load(this, resIDs[i], 1);    
     } 
    }; 

    public boolean onTouchEvent(MotionEvent evt){ 

     Random r = new Random(); 
     int x = r.nextInt(resIDs.length); 

     switch (evt.getAction()) 
     { 
      case MotionEvent.ACTION_DOWN: 
       AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
       float actualVolume = (float) audioManager 
           .getStreamVolume(AudioManager.STREAM_MUSIC); 
       float maxVolume = (float) audioManager 
           .getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
       float volume = actualVolume/maxVolume; 
       // Is the sound loaded already? 
       if (loaded) { 
         mSoundPool.play(soundIDs[x], volume, volume, 1, 0, 1f); 
         Log.i("Test", "Played sound"); 
       } 
      startAnimating(); 
      return super.onTouchEvent(evt); 

      case MotionEvent.ACTION_UP: 
      break; 
      default: 
      break; 
     } 
     return true; 
    } 

    private void startAnimating() { 

     ImageView wiub_screen01 = (ImageView) findViewById(R.id.wiub_screen01); 
     Animation fadein01 = AnimationUtils.loadAnimation(this, R.anim.fade_in01); 
     wiub_screen01.startAnimation(fadein01); 

     ImageView wiub_screen00 = (ImageView) findViewById(R.id.wiub_screen00); 
     Animation fadein00 = AnimationUtils.loadAnimation(this, R.anim.fade_in00); 
     wiub_screen00.startAnimation(fadein00); 
    } 
} 
+0

使用AudioManager/SoundPool时,声音文件的长度也是重要的吗?现在我的音频剪辑大约是30秒,但使用原始的AudioManager方法只需要5秒左右即可播放。 – n00bdev 2012-04-16 23:46:33

+0

我稍后会看看,但soundpool通常是短声。你一定要看看你的情况:http://www.stealthcopter.com/blog/2010/08/android-soundpool-vs-mediaplayer-focus-on-soundboards-and-memory-problems/ – 2012-04-17 00:54:37

+0

我已开始更改代码以使用MediaPlayer并解决了我的空指针异常问题。我将继续测试和更新代码。 – n00bdev 2012-04-17 13:38:36

0

尝试转换在原始文件夹中的文件,以OGG格式。

+0

我会在做任何代码更改之前尝试将文件转换为.ogg – n00bdev 2012-04-16 15:05:57

+0

我现在可以确认转换为.ogg不能解决问题。 – n00bdev 2012-04-16 22:32:00

+0

嗯..我曾经为媒体播放器做过这件事,它在舞台剧中有一个bug。需要使用音轨并自己进行解码。也许这会帮助你或使用soundpool。 – MahdeTo 2012-04-17 10:48:17