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

ExoPlayer TrackSelectionDialog自定义Format比较器不生效,无法按视频高度从小到大排序

ExoPlayer TrackSelectionDialog自定义Format比较器不生效,无法按视频高度从小到大排序

嘿,我帮你排查了下代码,问题主要出在比较器的逻辑实现上,另外也给你梳理下需要确认的细节:

1. 比较器返回值逻辑完全错误

你当前写的比较器:

(o1, o2) -> Math.max(o1.height, o2.height)

完全不符合Comparator接口的要求。compare方法的返回规则是:

  • 当o1应该排在o2前面(比如o1高度更小),返回负数
  • 两者属性相等时返回0
  • 当o1应该排在o2后面,返回正数

而你返回的是两个高度的最大值,这只会返回正数或其中一个高度值,根本起不到排序的作用。正确的写法应该是返回两个高度的差值,用Integer.compare来处理(避免手动写差值可能出现的溢出问题):

trackSelectionDialog.setTrackFormatComparator((o1, o2) -> Integer.compare(o1.height, o2.height));

这样就能实现视频轨道按高度从小到大排序;如果想要从大到小,就反过来写Integer.compare(o2.height, o1.height)。

2. 确认比较器的传递是否正常

你在TrackSelectionDialog中新增的setTrackFormatComparator方法,把比较器赋值给了静态变量trackFormatComparator,要确保在TrackSelectionViewFragment的onCreateView中,这个静态变量能正确传递到trackSelectionView.init方法里。不过从你的代码来看这部分是没问题的,主要问题还是出在比较器逻辑上。

3. 额外注意:TrackGroup的分组影响

TrackSelectionView是按TrackGroup对轨道进行分组的,你设置的比较器只作用于同一个TrackGroup内的轨道排序。如果你的视频轨道属于不同的TrackGroup,组与组之间的顺序不会被这个比较器影响,只有组内的轨道会按高度排序。如果需要组之间也按高度排序,那需要额外处理,但一般视频轨道会归为同一组,先修正比较器应该就能解决你的问题。

备注:内容来源于stack exchange,提问作者danyapd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 09:33:02