ExoPlayer调用seek相关接口后视频缩放功能异常求助
ExoPlayer HLS流seek后视频缩放异常问题
使用ExoPlayer 2.18.3播放HLS流时,初始加载显示正常,但调用seekBack、seekForward或seekTo接口后,视频缩放功能出现异常。
初始显示效果:
seek后异常显示效果:
布局代码
<com.google.android.exoplayer2.ui.PlayerView android:id="@+id/exoPlayer" android:layout_width="0dp" android:layout_height="0dp" app:resize_mode="fit" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:use_controller="false"/>
初始化代码
init { exoPlayer = ExoPlayer.Builder(context).build() exoPlayer.videoScalingMode = C.VIDEO_SCALING_MODE_SCALE_TO_FIT exoPlayer.addListener(this) }
解决方案尝试
- seek完成后强制刷新缩放配置
在onSeekComplete回调中手动重置PlayerView的resize模式,触发缩放逻辑重新计算:
override fun onSeekComplete(playbackState: PlaybackState) { super.onSeekComplete(playbackState) playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT exoPlayer.videoScalingMode = C.VIDEO_SCALING_MODE_SCALE_TO_FIT }
- 禁用自适应分辨率切换
若HLS流包含多分辨率分片,seek后可能触发分辨率切换导致缩放异常,可固定播放分辨率:
val trackSelector = DefaultTrackSelector(context) trackSelector.setParameters( trackSelector.buildUponParameters() .setVideoSizeConstraints( /* maxWidth = */ 1280, /* maxHeight = */ 720, /* maxPixelCount = */ 1280 * 720 ) ) exoPlayer = ExoPlayer.Builder(context) .setTrackSelector(trackSelector) .build()
升级ExoPlayer版本
2.18.3存在部分已知的seek相关渲染bug,建议升级至2.20.x及以上稳定版本,官方后续版本已修复类似的缩放适配问题。监听视频尺寸变化并重设缩放
通过VideoListener监听视频尺寸变更,在回调中强制设置缩放模式:
exoPlayer.addVideoListener(object : VideoListener { override fun onVideoSizeChanged(videoSize: VideoSize) { exoPlayer.videoScalingMode = C.VIDEO_SCALING_MODE_SCALE_TO_FIT playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT } override fun onRenderedFirstFrame() {} override fun onVideoEnabledChanged(isEnabled: Boolean) {} })
内容的提问来源于stack exchange,提问作者Stephan Pepper
相关产品推荐
相关产品推荐

