Android 速度/播放速度变化
Posted
技术标签:
【中文标题】Android 速度/播放速度变化【英文标题】:Android Tempo/playback speed change 【发布时间】:2014-04-08 07:36:24 【问题描述】:我正在创建一个需要实时更改播放速率/速度的 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)
但是,在所有这些在线示例中,都没有提到这一点。我错过了什么,可以使用吗?
非常感谢任何帮助
【问题讨论】:
【参考方案1】:setPlaybackRate()
确实可以使用,但它可能不是您想要的。
假设您有一个 44100 的音频流。您可以使用此函数将播放速率设置为 22050 Hz,这意味着样本将以一半的速率馈送到音频输出,并且确实会减慢音乐。缺点是音频的频率也会下降到一半,因为同样的事实是样本以一半的速率馈送。
目前没有直接的 Android API 来进行时间拉伸。这些算法在数学方面非常繁重,即使你可以用 Java 编写它们,性能也会很糟糕。
最好的方法是使用 JNI 在 C++ 中寻找实现,这可能包括像 ffmpeg 这样的库。
【讨论】:
感谢您的回复 Merlevede 我实际上不介意音高/频率是否减慢或增加,所以也许这会起作用。我做了更多的研究,发现有几页提到该方法不适用于 MP3 文件,这是一个大问题,因为它将用于音乐文件。好的,我不知道如何使用 JNI 或它是什么,但我会看看。感谢您的帮助,如果您有更多信息将不胜感激【参考方案2】:从 API 23 开始,MediaPlayer 可以使用this method 设置播放速度。
类媒体播放器
public void setPlaybackParams (PlaybackParams params)
在 API 中添加 23级使用 PlaybackParams 设置播放速率。参数 params PlaybackParams:播放参数。抛出 IllegalStateException 如果 内部播放器引擎尚未初始化。 如果不支持 params,则 IllegalArgumentException。
示例代码:
MediaPlayer mp = ...; //Whatever
float speed = 0.75f;
mp.setPlaybackParams(mp.getPlaybackParams().setSpeed(speed));
【讨论】:
以上是关于Android 速度/播放速度变化的主要内容,如果未能解决你的问题,请参考以下文章