Декодер рендерера Exoplayer не соответствует формату выбранного трека - PullRequest
0 голосов
/ 07 ноября 2018

Я тестирую источник 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 с чем-то).

1 Ответ

0 голосов
/ 07 ноября 2018

Это ложная тревога, извините. Как оказалось, указанный поток 720p действительно был ошибочно помеченным потоком 360p, что вызвало у меня замешательство.

Все это работало как задумано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...