ExoPlayer 2.8.2默认加载低带宽HLS流,如何设置默认加载高带宽码流?
问题原因
你当前的配置未生效是因为ExoPlayer 2.8.2版本中,AdaptiveTrackSelection.Factory存在独立的初始最大码率限制,优先级高于DefaultBandwidthMeter的初始带宽估计值,仅修改后者无法触发高码率初始加载。
解决方案
方案1:补全轨道选择工厂的初始码率配置
直接修改原有代码,补全AdaptiveTrackSelection.Factory的参数,明确指定初始最大码率,同时可配合轨道选择器参数强制初始优先选高码率:
final long targetInitialMaxBitrate = 10 * 1024 * 1024; // 按需设置合理值,示例为10Mbps,不要用Integer.MAX_VALUE避免弱网缓冲超时 DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder() .setInitialBitrateEstimate(targetInitialMaxBitrate) .build(); // 补全AdaptiveTrackSelection.Factory的参数,设置初始最大码率 TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory( bandwidthMeter, AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS, AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS, AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS, AdaptiveTrackSelection.DEFAULT_BANDWIDTH_FRACTION, targetInitialMaxBitrate // 核心配置:解除初始码率限制 ); trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); // 可选:初始强制选最高支持的码率 DefaultTrackSelector.Parameters parameters = trackSelector.getParameters() .buildUpon() .setForceHighestSupportedBitrate(true) .build(); trackSelector.setParameters(parameters); player = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector); DataSource.Factory mediaDataSourceFactory = new DefaultDataSourceFactory(getContext(), Util.getUserAgent(getContext(), getString(R.string.app_name))); if (currentGalleryModel.mediaUrl != null) { mediaSource = new HlsMediaSource(Uri.parse(currentGalleryModel.mediaUrl), mediaDataSourceFactory, null, null); player.setPlayWhenReady(false); player.prepare(mediaSource); // 可选:首次缓冲完成后关闭强制最高码率,恢复正常自适应逻辑 player.addListener(new Player.DefaultEventListener() { @Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { if (playbackState == Player.STATE_READY) { DefaultTrackSelector.Parameters newParams = trackSelector.getParameters() .buildUpon() .setForceHighestSupportedBitrate(false) .build(); trackSelector.setParameters(newParams); player.removeListener(this); } } }); }
方案2:自定义轨道选择类,强制初始选最高码率
如果需要更灵活的控制逻辑,可以自定义AdaptiveTrackSelection子类,重写初始轨道选择逻辑,首次加载直接选最高码率轨道,后续恢复正常自适应:
public class HighInitialBitrateTrackSelection extends AdaptiveTrackSelection { public HighInitialBitrateTrackSelection(Format[] formats, BandwidthMeter bandwidthMeter) { super(formats, bandwidthMeter); } @Override public int selectTrack(long bufferedDurationUs, long playbackPositionUs, List<? extends MediaChunk> queue) { // 初始加载队列为空时,直接选最高码率轨道 if (queue.isEmpty()) { return getFormatCount() - 1; } return super.selectTrack(bufferedDurationUs, playbackPositionUs, queue); } public static class Factory extends AdaptiveTrackSelection.Factory { public Factory(BandwidthMeter bandwidthMeter, long maxInitialBitrate) { super(bandwidthMeter, DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS, DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS, DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS, DEFAULT_BANDWIDTH_FRACTION, maxInitialBitrate); } @Override public TrackSelection createTrackSelection(TrackGroup group, BandwidthMeter bandwidthMeter, int... tracks) { Format[] formats = new Format[tracks.length]; for (int i = 0; i < tracks.length; i++) { formats[i] = group.getFormat(tracks[i]); } // 按码率从小到大排序 Arrays.sort(formats, (f1, f2) -> Long.compare(f1.bitrate, f2.bitrate)); return new HighInitialBitrateTrackSelection(formats, bandwidthMeter); } } }
使用自定义的HighInitialBitrateTrackSelection.Factory替换原有代码中的AdaptiveTrackSelection.Factory即可。
注意事项
- 初始码率上限需要根据业务场景合理设置,过高会导致弱网环境下初始缓冲时间过长甚至加载失败。
- 若后续升级ExoPlayer到2.10及以上版本,轨道选择相关API有较大调整,需要对应修改配置逻辑。
内容的提问来源于stack exchange,提问作者shiv prakash
相关产品推荐
相关产品推荐

