Android 在Exoplayer中更改播放速度

Android 在Exoplayer中更改播放速度,android,exoplayer,Android,Exoplayer,我希望实现一个具有变速播放(1.0x,1.25x,1.5x)的音频播放器,就像目前市场上典型的有声读物播放器一样。我想使用谷歌的Exoplayer库作为我的audioplayer库,但它们似乎不支持变速播放。关于如何实现此功能的任何想法,或者支持此功能的任何扩展?您所需要的就是 如果您查看MediaCodeAudioTrackRenderer.java, 您可以通过方法processOutputBuffer从ExoPlayer获取输出缓冲区(由MediaCodec解码),并通过Sonic.jav

我希望实现一个具有变速播放(1.0x,1.25x,1.5x)的音频播放器,就像目前市场上典型的有声读物播放器一样。我想使用谷歌的Exoplayer库作为我的audioplayer库,但它们似乎不支持变速播放。关于如何实现此功能的任何想法,或者支持此功能的任何扩展?

您所需要的就是

如果您查看MediaCodeAudioTrackRenderer.java, 您可以通过方法processOutputBuffer从ExoPlayer获取输出缓冲区(由MediaCodec解码),并通过Sonic.java进行相应处理,然后将其发送到AudioTrack

下面的文档解释了如何使用libsonic

你应该看看这个项目,它对我非常有用:

在SimpleXoPlayer中,我实现了以下方法:

 private final ExoPlayer player;
private float playbackSpeed;

float SPEED_NORMAL = 1f;
float SPEED_MEDIUM = 1.5f;
float SPEED_HIGH = 2f;


 @Override
public float getPlaybackSpeed() {
    return playbackSpeed;
}

@Override
public void setPlaybackSpeed(float speed) {
    playbackSpeed = speed;
    player.setPlaybackSpeed(speed);
}

@Override
public void changePlaybackSpeed() {
    if (playbackSpeed == SPEED_MEDIUM) {
        player.setPlaybackSpeed(SPEED_HIGH);
        playbackSpeed = SPEED_HIGH;
    } else if (playbackSpeed == SPEED_HIGH) {
        player.setPlaybackSpeed(SPEED_NORMAL);
        playbackSpeed = SPEED_NORMAL;
    } else {
        player.setPlaybackSpeed(SPEED_MEDIUM);
        playbackSpeed = SPEED_MEDIUM;
    }
}
我设置并保存了这样的速度,因为当我试图获取上次保存的速度时,出现了一个错误。因此,遵循这个机制,它将完美地工作


干杯

功能
setPlaybackSpeed()
已删除,现在您可以通过以下方式设置播放速度:

    PlaybackParameters param = new PlaybackParameters(speed);
    mExoPlayer.setPlaybackParameters(param);
speed
是一个浮点数。正常速度为
1f
,速度加倍为
2f

试试这个 我遵循了所有的答案,没有任何效果,所以我尝试了下面的解决方案,它对我有效

PlaybackParams param = new PlaybackParams();
param.setSpeed(1f);// 1f is 1x, 2f is 2x 
exoPlayer.setPlaybackParams(param);
Kotlin扩展解决方案 通过Kotlin中的应用程序轻松访问并可靠设置

// To set
player.playbackSpeed = 2f

var SimpleExoPlayer.playbackSpeed: Float
    get() = playbackParameters?.speed ?: 1f
    set(speed) {
        val pitch = playbackParameters?.pitch ?: 1f
        playbackParameters = PlaybackParameters(speed, pitch)
    }

首先,感谢@T.J的回复,非常感谢。我在谷歌上搜索了一下,发现这个实现看起来和你说的很接近吗?我尝试将它与Exoplayer库集成,但似乎没有任何声音。没问题。是的,那正是我所说的。不知道为什么没有声音。我想用LogProcessOutputBuffer来查看数据发生了什么。更新:对于仍在搜索的任何人来说,这只是一个更新:Exoplayer已将此功能添加到他们的API中。快乐编码!这是实时的还是加载时间的?@Swapnil:我不明白你的意思,你能更具体地回答你的问题吗?我是说,我们可以在媒体播放时更改音高和节奏,还是只在加载音频时指定ot。播放时可以更改速率。@Swapnil是的,它是实时速度此解决方案在23 android版本以下无法工作。