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

