Exoplayer Mediaplayer Android 延迟应用 PlaybackParameters

Exoplayer Mediaplayer Android delay applying PlaybackParameters

我正在使用 Exoplayer 在我的应用程序中播放视频,我想做的是改变播放速度,为此 Exoplayer 提供了一个简单的解决方案:

    val playbackParameters = PlaybackParameters(whateverSpeedFloat)
    exoPlayer.setPlaybackParameters(playbackParameters)

现在这可行了,但我遇到的问题是效果不是立竿见影的,当你改变速度时,实际速度需要几帧才能改变。我猜是因为有些帧被预加载或缓冲,设置的播放参数只影响这之后的帧。

如果我停止播放视频,将速度从 0.5x 更改为 2x,然后按播放,很明显播放速度更改有延迟。但是,如果我按下停止,将速度从 0.5 倍更改为 2 倍,并在视频中寻找不同的点,然后按下播放,效果很好,没有延迟。我猜 reloads/buffers 具有正确播放参数的新帧。我试过

   exoPlayer.clearVideoDecoderOutputBufferRenderer() 

在设置回放参数后更改速度尝试重新缓冲帧,但它似乎没有任何改变。 有想法该怎么解决这个吗?或者其他不会有这个问题的视频播放器库?

我认为您可以在 ExpPlayer 初始化期间减少配置设置中的缓冲时间。下面前。在配置上,您可以抛出文档并检查可能的值。

/* Instantiate a DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();

/* Maximum amount of media data to buffer (in milliseconds). */
final long loadControlMaxBufferMs = 60000;

/*Configure the DefaultLoadControl to use our setting for how many
Milliseconds of media data to buffer. */
builder.setBufferDurationsMs(
DefaultLoadcontrol.DEFAULT MIN BUFFER MS,
loadControlMaxBufferMs,
/* To reduce the startup time, also change the line below */
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,

DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);

/* Build the actual DefaultLoadControl instance */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();

/* Instantiate ExoPlayer with our configured DefaultLoadControl */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(),
loadControl);

还有一篇关于更改缓冲时间选项的好文章。

更新:

我仍然没有找到解决方案,我把这个问题带到了 ExoPlayer 并提出了一个问题并“修复”了(https://github.com/google/ExoPlayer/issues/7982),但是我仍然遇到同样的问题,所以 atm 我只会回复他们并等待。

但是,提到的延迟是一个已知问题,目前没有解决方案,

Correct. We looked at options to address the delay a while ago but couldn't find a clean/general/easy to implement approach (there is no API we can use to process the audio just before the mixer, so we have to do it upstream of the audio track buffer, which introduces latency).

相反,他们建议使用 DefaultRenderersFactory 初始化 Exoplayer,并将 AudioTrackPlaybackParams 设置为 true:

        val defaultRenderersFactory =
        DefaultRenderersFactory(this).setEnableAudioTrackPlaybackParams(true)

        exoPlayer = SimpleExoPlayer.Builder(this, defaultRenderersFactory).build()

这确实消除了延迟(不是 100%,但我会说大约 80%,这已经足够了),但是视频速度变得很笨重,每次都开始冻结和改变速度是 paused/played 或寻找到不同的点。

我也尝试修改@GensaGames 建议的缓冲配置,但即使我测试了一段时间的不同配置,我也从未发现行为有任何变化,因此放弃了解决方案并转到了 exoPlayer 存储库。

当我终于有了一个可用的视频转换器时,我会更新这个问题。