2013-09-24 122 views
2

我一直在努力調整記錄一段音頻的從代碼之後的間距:改變音高和記錄頻率音頻

http://developer.android.com/guide/topics/media/audio-capture.html

我的猜測是,這個調整應該與實現MediaRecorder

http://developer.android.com/reference/android/media/MediaRecorder.html

不過,我不能確定打電話來改變音調哪種方法?

翻看SO,我發現changing the frequency of a soundfile in android,但我很困惑如何將SoundPool與我正在遵循的音頻捕捉指南中的元素進行整合。基於我正在使用的開發人員指南,是否有更直接的解決方案?

+0

當你說「調整音高」時,你的意思是簡單地以不同的速度播放樣本(這將影響播放的持續時間),還是你希望保持相同的持續時間,只改變音高(音高移動)? – Michael

+0

@Michael目前我正在尋找保持相同的持續時間,只改變音頻文件的音高/音色。如果您對此有任何想法,請告訴我。提前感謝 – srinivas

回答

3
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
mSoundPool = new SoundPool(size, AudioManager.STREAM_MUSIC, 0); 
mSoundPoolMap = new HashMap<Integer, Integer>(); 
mSoundPoolMap.put(index, mSoundPool.load(context, R.raw.sound, 1)); 


mSoundPool.play(id, streamVolume, streamVolume, 1, loop, 1f); 

頻率是1f部分。如果您將其更改爲介於.5f和2.0f之間的值,這會減慢或加快樣本的速度,從而改變音高。

下面是一些代碼從我的應用程序之一:

private SoundPool soundpool; 
    private HashMap<Integer, Integer> soundsMap; 

    protected void onCreate(Bundle savedInstanceState) { 

soundpool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100); 
     soundsMap = new HashMap<Integer, Integer>(); 
     soundsMap.put(cowbell1, soundpool.load(this, R.raw.cowbell, 1)); 
     soundsMap.put(cowbell2, soundpool.load(this, R.raw.cowbell1, 1)); 
     soundsMap.put(cowbell3, soundpool.load(this, R.raw.windhh3, 1)); 

} 

    public void playSound(int sound, float fSpeed) { 
    AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
    float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC); 
    float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
    float volume = streamVolumeCurrent/streamVolumeMax; 
    soundpool.play(soundsMap.get(sound), volume, volume, 1, 0, fSpeed); 
    } 

要叫一聲我用這個:

   playSound(cowbell1, 1.0f); 
or 
       playSound(cowbell2, 1.0f); 

速度可以改變通過改變1.0F值。

如果您仍然無法發佈您的代碼,我會看看它。