我正在制作一款需要实时更改播放速度/速度的Android应用。我在互联网上搜索并看到了很多解决方案,包括 Tutorials for OpenSL ES for Android How to change audio tempo and pitch individuality using ffmpeg?
由于我对开发和Android很陌生,其中一些只是出于我的缩影。
其中许多例子都讨论Soundpool,但这个api不能用于大文件。
查看API和类后,我发现方法setPlaybackRate(int sampleRateInHz) 在AudioTrack类下。 http://developer.android.com/reference/android/media/AudioTrack.html#setPlaybackRate(int)
然而,在所有这些例子中,网上没有人提到这一点。我错过了什么,可以用吗?
非常感谢任何帮助
答案 0 :(得分:2)
setPlaybackRate()
确实可以使用,但它可能不是你想要的。
假设您有一个44100的音频流。您可以使用此功能将播放设置为22050 Hz,这意味着样本将以一半的速率馈送到音频输出,这确实会减慢音乐。缺点是音频的频率也会下降到一半,因为样本以一半的速率馈送。
目前还没有直接的Android API来进行时间延长。这些算法在数学上是非常繁重的,即使你可以用Java编写它们,性能也会很糟糕。
最好的方法是使用JNI在C ++中查找实现,这可能包括像ffmpeg这样的库。
答案 1 :(得分:2)
从 API 23开始,MediaPlayer可以使用this method设置播放速度。
Class MediaPlayer
public void setPlaybackParams (PlaybackParams params)
在API中添加 等级23使用PlaybackParams设置播放速率。参数参数 PlaybackParams:回放参数。如果是,则抛出IllegalStateException 内部播放器引擎尚未初始化。 如果不支持params,则为IllegalArgumentException。
示例代码:
MediaPlayer mp = ...; //Whatever
float speed = 0.75f;
mp.setPlaybackParams(mp.getPlaybackParams().setSpeed(speed));