Я тестирую источник HLS, который имеет четыре формата: 720p, 360p, 180p и только аудио.
Моя текущая реализация Exoplayer выглядит следующим образом:
DefaultBandwidthMeter bandwidthMeter;
//In onViewCreated()
bandwidthMeter = new DefaultBandwidthMeter.Builder()
.setInitialBitrateEstimate(2000000)
.setEventListener(getHandler(), (elapsedMs, bytes, bitrate) -> {
try {
Trace.i("GameSourceSpecs : " + elapsedMs + " " + bytes + " " + bitrate);
} catch (Exception e) {
Trace.w(e);
}
})
.build();
private MediaSource buildHLSMediaSource(Uri uri) {
DefaultDataSourceFactory dsf = new DefaultDataSourceFactory(getActivity(), "ua", bandwidthMeter);
DefaultHlsDataSourceFactory dsfHls = new DefaultHlsDataSourceFactory(dsf);
return new HlsMediaSource.Factory(dsfHls).createMediaSource(uri);
}
TrackSelection.Factory adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory);
((DefaultTrackSelector) trackSelector).setParameters(new DefaultTrackSelector.ParametersBuilder().build());
mMediaSource360 = buildHLSMediaSource(Uri.parse("http://35.187.250.251:8880/live/playlist.m3u8"));
mMediaSource360.addEventListener(getHandler(), new MSourceDebuggerListener("GameMediaSource360"));
//noinspection deprecation
mPlayer = ExoPlayerFactory.newSimpleInstance(mActivity, trackSelector, new DefaultLoadControl(
new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE),
1000, // min buffer
2000, // max buffer
1000, // playback
1000, //playback after rebuffer
DefaultLoadControl.DEFAULT_TARGET_BUFFER_BYTES,
true
));
mPlayer.prepare(source, true, true);
mPlayer.setPlayWhenReady(true);
Файл HLS, который я пытался воспроизвести, выглядит следующим образом:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=544100,RESOLUTION=360x640
chunklist_w2108226616_b544100_sleng.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=294100,RESOLUTION=180x320
chunklist_w2108226616_b294100_sleng.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=48000
chunklist_w2108226616_b48000_ao_sleng.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1044100,RESOLUTION=720x1280
chunklist_w2108226616_b1044100_sleng.m3u8
Я мог видеть доступные дорожки в Exoplayer с getCurrentMappedTrackInfo()
, перечисляя все доступные разрешения видео дорожек. Однако, когда я попытался установить максимальный размер видео на 720p, используя:
dts.setParameters(new DefaultTrackSelector.ParametersBuilder()
.setMaxVideoSize(720, 1280)
.setMaxVideoBitrate(Integer.MAX_VALUE)
.build());
Видеодорожка, конечно, была заменена на 720p, но декодер остается на 360p. Что мне сделать, чтобы декодер соответствовал выбранному формату дорожки?
EDIT:
Я знаю, что битрейт 720p равен 1044100, и в прошлый раз, когда я проверял, когда поток все еще был включен, моя оценка пропускной способности была намного выше этого (1900000 с чем-то).