5

我试过了

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

什么会更好用?有什么想法或建议吗?我应该如何接近?

4

2 回答 2

3

只是根据我的经验提供一些信息。OpenSL ES 是另一种选择。它是一个 C++ 库,因此您需要使用 Android NDK。我无法让这个方法工作,因为由于某种原因,我一直收到一个错误,指出接口不受支持,即使它在文档中说它是http://mobilepearls.com/labs/native-android-api/ ndk/docs/opensles/

另一种选择是使用http://www.surina.net/soundtouch/,这是一个很棒的 C++ 库,可以与 android NDK 一起使用,并且得到了开发人员 Olli 的大力支持。

就您提到的其他方法而言:

  • MediaPlayer 根本不起作用
  • Soundpool 非常有限,因为它只能处理小文件
  • AudioTrack 看起来是最好的选择,但只播放 PCM 文件,因此可能需要转换 MP3 文件。
于 2014-04-15T14:28:01.957 回答
1

自上次回答以来,有些事情发生了变化,因此我将尝试提供一些新信息:

TL;DR: ExoPlayer 是最好的解决方案。它使用 Sonic 并且更容易编译。

媒体播放器

  • 优点:部分android API,无需添加库,最快的解决方案
  • 缺点:速度和音高仅适用于 API 23 及更高版本

如何改变速度:

mediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(1.5f));

索尼克 NDK

  • 优点:使用旧 API,质量好
  • 缺点:与 PCM 一起工作,因此需要 MP3 解码器,C 编译使您的项目和构建过程复杂化

但是... 缺点并没有那么糟糕。

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

  • 优点:使用 Sonic 获得速度/音高/速率,质量好,与 API 16 一起使用,由 Google 支持
  • 缺点:不像MediaPlayer那样是SDK的一部分,有点大(6k方法,1MB),使用比MediaPlayer复杂

使用 ExoPlayer 创建 Activity 的教程

文档和样本

完成本教程后,速度更改很简单:

player.setPlaybackParameters(new PlaybackParameters(1.5f, 1.0f));

几年前,带解码器的 Sonic 是最好的解决方案,但现在 ExoPlayer 是最好的。它支持足够老的 API,使用 Sonic,具有相同的语音质量,不需要复杂的编译和项目设置。

于 2018-09-13T22:17:07.807 回答