2014-03-05 184 views
4

我創建一個Android應用程序需要播放速率/速度的實時變化。我已經找遍了互聯網,看到許多解決方案,包括 Tutorials for OpenSL ES for Android How to change audio tempo and pitch individuality using ffmpeg?Android的速度/播放速度變化

,因爲我比較新的發展和Android有些是簡單地從我leauge的。

許多這些例子講的Soundpool但這種API不使用大文件。

在瀏覽API和類後,我發現AudioTrack類下的方法setPlaybackRate(int sampleRateInHz) 。 http://developer.android.com/reference/android/media/AudioTrack.html#setPlaybackRate(int)

然而,在所有這些例子中他們的在線沒有提到這一點。我錯過了什麼,可以使用嗎?

任何幫助深表感謝

回答

2

setPlaybackRate()確實可以使用,但它可能不是你所期待的。

假設您有一個44100的音頻流。您可以使用此功能將回放速率設置爲22050 Hz,這意味着樣本將以一半的速率饋送到音頻輸出,並且它確實會減慢速度音樂。缺點是音頻的頻率也會下降到一半,這是因爲樣品以一半的速率饋送的相同事實。

目前還沒有任何直接的Android API做一次拉伸。這些算法在數學上非常沉重,即使你可以用Java編寫它們,性能也會很糟糕。

最好的辦法是尋找在C++中使用JNI的實現,而這可能會包括像的ffmpeg庫。

+0

謝謝您的回覆Merlevede 我其實如果俯仰/頻率減慢或增大,所以也許這將工作不介意。我做了一些更多的研究,發現幾頁提到這種方法不適用於MP3文件,這是一個很大的問題,因爲它將用於音樂文件。 好吧,我不知道如何使用JNI或它是什麼,但我會看看。 感謝您的幫助,如果您有任何更多的信息,將不勝感激 –

2

開始API 23,MediaPlayer可以使用this method設置播放速度。

類的MediaPlayer

public void setPlaybackParams (PlaybackParams params)在API 水平23

集回放速率使用PlaybackParams。參數params PlaybackParams:播放參數。如果 內部播放器引擎尚未初始化,則拋出IllegalStateException。 IllegalArgumentException如果不支持參數。

示例代碼:

MediaPlayer mp = ...; //Whatever 
float speed = 0.75f;  
mp.setPlaybackParams(mp.getPlaybackParams().setSpeed(speed));