2012-04-16 89 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