2011-04-19 86 views
1

雖然經驗豐富的開發,我是新來的Android,和我想開發一個應用程序通過Android的麥克風在錄製音頻的用戶可定義的部分之間循環。Android的音頻循環

我想低延遲當循環點被擊中時(即尋找該部分的起始點並恢復回放的最短時間)。

我以後的一般建議如我:

音頻文件格式
哪些類,我應該考慮播放(如的Soundpool,媒體播放器等)

感謝您的任何意見

Dave

回答

5

您可以使用像這樣的媒體播放器和OnCompletetionListener:

MediaPlayer mp; 
    mp = MediaPlayer.create(getApplicationContext(), R.raw.yoursound); 
    mp.setOnCompletionListener(new OnCompletionListener() { 

     public void onCompletion(MediaPlayer mp) { 
      mp.create(getApplicationContext(), R.raw.nextsound); 
      mp.prepare(); 
      mp.start(); 
     } 

    }); 
    mp.prepare(); 
    mp.start(); 

至於聲音文件類型,我從來沒有注意到它們之間的很大區別。我傾向於堅持使用.mp3或.ogg,儘管只是因爲文件大小比.wav小。

編輯:啊我明白了,如果你是想在播放整個音頻文件並通過你只需要調用setLooping(真)是這樣的:

MediaPlayer mp; 
    mp = MediaPlayer.create(getApplicationContext(), R.raw.yoursound); 
    mp.setLooping(true); 
    mp.prepare(); 
    mp.start(); 

如果你正在嘗試播放全音頻文件一次,然後循環它的一些小部分它可以使用像這樣的completionlistener內的.seekTo()方法:

MediaPlayer mp; 
    mp = MediaPlayer.create(getApplicationContext(), R.raw.yoursound); 
    mp.setOnCompletionListener(new OnCompletionListener() { 

     public void onCompletion(MediaPlayer mp) { 
      // TODO Auto-generated method stub 
      mp = MediaPlayer.create(getApplicationContext(), R.raw.yoursound); 
      mp.seekTo(3000); //3 seconds in 
      mp.prepare(); 
      mp.start(); 
     } 

    }); 
    mp.prepare(); 
    mp.start(); 
+0

謝謝!如果我正確理解這一點,這裏描述的是R.raw.yoursound的完成會觸發R.raw.nextsound的播放,這與我之後的不一樣。我希望能夠指示播放對象在某個點(循環結束)到達時在文件中的特定點(循環開始)處恢復播放 - 在一個聲音文件中。雖然總是有這種機會,但我錯過了一些微妙的東西! – David 2011-04-19 14:07:44

+0

行Tim,謝謝 - 鑑於它是觸發循環的**完成**監聽器,這意味着終點必須始終是文件的結尾,而不是聲音文件中的任意點 - I想知道如果audiotrack類可能更多我在尋找哪裏我可以getPlaybackHeadPosition()回放期間確定循環的開始和結束點,然後使用setLoopPoints()重複該部分 - 你用過這個?你能看到這個appoach有什麼問題嗎? – David 2011-04-20 08:23:46

+0

我以前沒有用過那個類。但對我來說這似乎是一個很好的方法。 – FoamyGuy 2011-04-22 15:52:15