2011-04-19 126 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