You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExoPlayer播放视频列表时视频间出现黑屏问题求助

ExoPlayer列表切换黑屏问题解决方法

针对你用ExoPlayer播放本地视频列表时切换出现短暂黑屏的问题,可通过以下几个方向优化:

1. 优化媒体源预加载管理

当前代码逐个创建ProgressiveMediaSource再添加到ConcatenatingMediaSource,改为直接传递MediaItem给ConcatenatingMediaSource,让ExoPlayer更高效地管理预加载逻辑:

private fun createExternalMediaSource(context: Context): MediaSource {
    val mediaItems = externalPlaylist.map { file ->
        MediaItem.fromUri(Uri.fromFile(file))
    }
    val dataSourceFactory = DefaultDataSource.Factory(context)
    val mediaSourceFactory = ProgressiveMediaSource.Factory(dataSourceFactory)
    // 直接用MediaItem列表构建,提升预加载效率
    return ConcatenatingMediaSource(mediaSourceFactory, mediaItems)
}

2. 调整缓冲策略,增加预加载缓冲

当前LoadControl的所有缓冲时长都设为3000ms,可调整参数让播放器在播放当前视频时预加载下一个视频的内容:

val loadControl = DefaultLoadControl.Builder()
    .setBufferDurationsMs(
        DefaultLoadControl.DEFAULT_MIN_BUFFER_MS,
        6000, // 增大最大缓冲时长
        DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
        DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS
    )
    .setBackBufferDurationMs(5000) // 设置后台缓冲,预加载后续视频
    .build()

3. 保留Surface最后一帧

开启keepContentOnPlayerReset,让视频切换时Surface不被清空,保持上一个视频的最后一帧直到下一个视频渲染完成:

val exoPlayer = SimpleExoPlayer.Builder(...).build()
// 添加这行配置
exoPlayer.setKeepContentOnPlayerReset(true)

4. 启用扩展渲染器(可选)

如果视频包含H.265等需要硬件加速的格式,开启扩展渲染器可加快解码速度,减少切换时的等待时间:

val rendererFactory = DefaultRenderersFactory(context)
// 改为优先使用扩展渲染器
rendererFactory.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER)

5. 优化媒体源工厂配置

使用DefaultMediaSourceFactory并开启预加载准备,让播放器提前初始化下一个视频的资源:

// 在创建ExoPlayer时,替换原有的MediaSourceFactory
val mediaSourceFactory = DefaultMediaSourceFactory(context)
    .setDataSourceFactory(DefaultDataSource.Factory(context))
    .setPreloadPrepare(true) // 开启预加载准备

val exoPlayer = SimpleExoPlayer.Builder(
    context,
    rendererFactory,
    trackSelector,
    mediaSourceFactory, // 使用新的工厂
    loadControl,
    bandwidthMeter,
    DefaultAnalyticsCollector(Clock.DEFAULT)
).build()

内容的提问来源于stack exchange,提问作者KramRus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:52:17