我试过了
1) MediaPlayer(it Doesnt support speed change).
2) SoundPool (play only small audio files)
3) AudioTrack (tried with JLayer- there is delay. decoder is slow).
4) Sonic NDK master - unable to play mp3 audio files
什么会更好用?有什么想法或建议吗?我应该如何接近?
我试过了
1) MediaPlayer(it Doesnt support speed change).
2) SoundPool (play only small audio files)
3) AudioTrack (tried with JLayer- there is delay. decoder is slow).
4) Sonic NDK master - unable to play mp3 audio files
什么会更好用?有什么想法或建议吗?我应该如何接近?
只是根据我的经验提供一些信息。OpenSL ES 是另一种选择。它是一个 C++ 库,因此您需要使用 Android NDK。我无法让这个方法工作,因为由于某种原因,我一直收到一个错误,指出接口不受支持,即使它在文档中说它是http://mobilepearls.com/labs/native-android-api/ ndk/docs/opensles/。
另一种选择是使用http://www.surina.net/soundtouch/,这是一个很棒的 C++ 库,可以与 android NDK 一起使用,并且得到了开发人员 Olli 的大力支持。
就您提到的其他方法而言:
自上次回答以来,有些事情发生了变化,因此我将尝试提供一些新信息:
TL;DR: ExoPlayer 是最好的解决方案。它使用 Sonic 并且更容易编译。
媒体播放器
如何改变速度:
mediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(1.5f));
索尼克 NDK
但是... 缺点并没有那么糟糕。
PCM 的事情实际上不再是问题了,因为 Android 有 MediaCodec API,所以你不需要外部 MP3 解码器。
我在 github 上有一个项目,它使用 Sonic 和 Android 的解码器并为 Android Studio 配置(原始项目是 Eclipse): https ://github.com/mega-arbuz/android-mp3-sonic-ndk
您还可以避免编译 C 代码并使用 Sonic 的 JAVA 实现: https ://github.com/waywardgeek/sonic/blob/master/Sonic.java
ExoPlayer
完成本教程后,速度更改很简单:
player.setPlaybackParameters(new PlaybackParameters(1.5f, 1.0f));
几年前,带解码器的 Sonic 是最好的解决方案,但现在 ExoPlayer 是最好的。它支持足够老的 API,使用 Sonic,具有相同的语音质量,不需要复杂的编译和项目设置。