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
相关产品推荐
相关产品推荐

