Exoplayer配置DefaultTrackSelector限制最低分辨率仍失效如何解决?
ExoPlayer强制256x144最低分辨率播放失效问题解决
问题背景
需要让ExoPlayer固定以最低分辨率(256x144)播放视频,初始对DefaultTrackSelector做了两项配置:
- 调用
setMaxVideoSize(width, height)将最大分辨率限制为目标参数 - 调用
setForceHighestSupportedBitrate(true)强制选择尺寸约束范围内支持的最高比特率
配置完成后播放器仍会播放超出限制的分辨率视频,需要定位修复。
初始配置代码
DefaultTrackSelector trackSelector = new DefaultTrackSelector(requireContext()); trackSelector.setParameters(trackSelector .buildUponParameters() .setMaxVideoSize(256, 144) .setForceHighestSupportedBitrate(true)); player = new SimpleExoPlayer.Builder(requireContext()) .setTrackSelector(trackSelector) .build(); player.setMediaItem(MediaItem.fromUri(videoUri)); player.setPlayWhenReady(true); player.prepare(); playerView.setPlayer(player);
运行日志(分辨率异常)
3314-13314/com.example D/EventLogger: downstreamFormat [eventTime=0.60, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.640028, res=1920x1080, fps=30.0] 2021-06-26 16:52:44.683 13314-13314/com.example D/EventLogger: videoInputFormat [eventTime=0.61, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.640028, res=1920x1080, fps=30.0] 2021-06-26 16:52:45.208 13314-13314/com.example D/EventLogger: downstreamFormat [eventTime=1.22, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.42C01E, res=480x270, fps=29.999668] 2021-06-26 16:52:45.278 13314-13314/com.example D/EventLogger: videoInputFormat [eventTime=1.27, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.42C01E, res=480x270, fps=29.999668] 2021-06-26 16:52:45.317 13314-13314/com.example D/EventLogger: downstreamFormat [eventTime=1.42, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.4D401F, res=720x720, fps=29.999668] 2021-06-26 16:52:45.590 13314-13314/com.example D/EventLogger: videoInputFormat [eventTime=1.69, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.4D401F, res=720x720, fps=29.999668] 2021-06-26 16:52:54.257 13314-13314/com.example D/EventLogger: downstreamFormat [eventTime=0.21, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.64001F, res=960x540, fps=29.999342] 2021-06-26 16:52:54.666 13314-13314/com.example D/EventLogger: videoInputFormat [eventTime=0.62, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.64001F, res=960x540, fps=29.999342] 2021-06-26 16:52:56.331 13314-13314/com.example D/EventLogger: downstreamFormat [eventTime=0.60, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.64001F, res=608x1080, fps=30.0] 2021-06-26 16:52:56.413 13314-13314/com.example D/EventLogger: videoInputFormat [eventTime=0.69, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.64001F, res=608x1080, fps=30.0]
失效原因
setMaxVideoSize的约束逻辑是仅当视频源存在等于或小于设定尺寸的轨道时,才会选中符合要求的轨道;如果当前视频流(HLS/DASH等)没有256x144档位的轨道,ExoPlayer会自动向上适配最小的可播放轨道,这是日志中出现更高分辨率的核心原因。- 初始配置未关闭自适应分辨率切换逻辑,网络波动时ExoPlayer会自动切换到更高分辨率的轨道。
修复方案
- 首先确认视频流是否包含256x144分辨率的转码档位,没有的话需要先在服务端补全对应分辨率的输出。
- 新增关闭自适应切换的配置,锁定分辨率档位,可选补充比特率限制进一步约束。
修复后完整代码
DefaultTrackSelector trackSelector = new DefaultTrackSelector(requireContext()); trackSelector.setParameters(trackSelector .buildUponParameters() .setMaxVideoSize(256, 144) // 关闭视频分辨率自适应切换 .setAllowVideoResolutionAdaptiveness(false) .setAllowVideoMixedMimeTypeAdaptiveness(false) .setForceHighestSupportedBitrate(true) // 可选配置:如果已知256x144对应的最高比特率,加这行进一步约束,单位为bps // .setMaxVideoBitrate(500000) ); player = new SimpleExoPlayer.Builder(requireContext()) .setTrackSelector(trackSelector) .build(); player.setMediaItem(MediaItem.fromUri(videoUri)); player.setPlayWhenReady(true); player.prepare(); playerView.setPlayer(player);
内容的提问来源于stack exchange,提问作者Tushar Lathiya
相关产品推荐
相关产品推荐

