在 Exoplayer 中更改播放速度
Changing playback speed in Exoplayer
我正在寻求实现一个具有可变速度播放(1.0x、1.25x、1.5x)的音频播放器,就像目前市场上典型的有声读物播放器一样。我想使用 Google 的 Exoplayer 库作为我的音频播放器库,但它们似乎不支持变速播放。关于如何实现这个的任何想法,或者任何支持这个的扩展?
你只需要 https://github.com/waywardgeek/sonic/blob/master/Sonic.java
如果您查看 MediaCodecAudioTrackRenderer.java,
您可以在 processOutputBuffer 方法中从 ExoPlayer 获取输出缓冲区(由 MediaCodec 解码),并通过 Sonic.java 相应地处理它,然后再将其发送到AudioTrack.
以下文档解释了如何使用 libsonic
https://github.com/waywardgeek/sonic/blob/master/doc/index.md
你应该看看这个项目,它对我很有用:
https://github.com/AmrMohammed89/exoplayer2.4.0_speedup
在 SimpleExoPlayer 中,我实现了以下方法:
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)
}
在 Exoplayer 版本中 2.14.0
像这样直接传递float
值。
simpleExoPlayer?.setPlaybackSpeed(1.0f)
我正在寻求实现一个具有可变速度播放(1.0x、1.25x、1.5x)的音频播放器,就像目前市场上典型的有声读物播放器一样。我想使用 Google 的 Exoplayer 库作为我的音频播放器库,但它们似乎不支持变速播放。关于如何实现这个的任何想法,或者任何支持这个的扩展?
你只需要 https://github.com/waywardgeek/sonic/blob/master/Sonic.java
如果您查看 MediaCodecAudioTrackRenderer.java, 您可以在 processOutputBuffer 方法中从 ExoPlayer 获取输出缓冲区(由 MediaCodec 解码),并通过 Sonic.java 相应地处理它,然后再将其发送到AudioTrack.
以下文档解释了如何使用 libsonic https://github.com/waywardgeek/sonic/blob/master/doc/index.md
你应该看看这个项目,它对我很有用: https://github.com/AmrMohammed89/exoplayer2.4.0_speedup
在 SimpleExoPlayer 中,我实现了以下方法:
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)
}
在 Exoplayer 版本中 2.14.0
像这样直接传递float
值。
simpleExoPlayer?.setPlaybackSpeed(1.0f)