ExoPlayer, как загружать большие части удаленных аудиофайлов

Я использую ExoPlayer 2 для воспроизведения удаленных треков. По умолчанию плеер загружает треки по частям (т.е. около 20 секунд, потом еще 20 секунд пока трек проигрывается).

Так как треки загружаются с удаленного сервера, бывает, что при обрыве соединения плеер больше не может загружаться. Есть ли способ сказать ExoPlayer, чтобы он загружал большие части аудиофайла (также всю дорожку сразу)?

Я пытался осмотреть ExtractorMediaSource, DataSource.Factory и DefaultExtractorsFactory, но не нашел ничего, что могло бы решить мою проблему.

val audioSource = ExtractorMediaSource(
        Uri.parse(videoUrl),
        mDataSourceFactory,    // DataSource.Factory
        mExtractor,    // DefaultExtractorsFactory
        null,
        null
)

mExoPlayer.prepare(audioSource)
mExoPlayer.playWhenReady = true

(это Kotlin, но вроде понятно и Java-программистам)


person Massimo    schedule 07.03.2017    source источник


Ответы (2)


Я нашел решение. Поскольку я не нахожу других связанных вопросов, я отвечу на свой вопрос (надеюсь, это кому-то понадобится в будущем):

Правильный объект для настройки — это LoadControl, переданный ExoPlayerFactory при создании объекта ExoPlayer:

Оригинальный ответ (устарел):

val loadControl = DefaultLoadControl(
            DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE),
            5 * 60 * 1000, // this is it!
            10 * 60 * 1000,
            DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS.toLong(),
            DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS.toLong()
)
exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl)

Обновленный ответ:

val bandwidthMeter = DefaultBandwidthMeter.Builder(context).build()
val trackSelectionFactory = AdaptiveTrackSelection.Factory()
val trackSelector = DefaultTrackSelector(trackSelectionFactory)

val loadControl = DefaultLoadControl.Builder()
        .setAllocator(DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE))
        .setBufferDurationsMs(
            5 * 60 * 1000, // this is it!
            10 * 60 * 1000,
            DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
            DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS
        )
        .setTargetBufferBytes(DefaultLoadControl.DEFAULT_TARGET_BUFFER_BYTES)
        .setPrioritizeTimeOverSizeThresholds(DefaultLoadControl.DEFAULT_PRIORITIZE_TIME_OVER_SIZE_THRESHOLDS)
        .createDefaultLoadControl()

exoPlayer = ExoPlayerFactory.newSimpleInstance(
        context,
        DefaultRenderersFactory(context),
        trackSelector,
        loadControl,
        null,
        bandwidthMeter)

Документ, в котором это объясняется.

person Massimo    schedule 07.03.2017
comment
Я получаю эту ошибку ~› Не удается разрешить метод «DefaultAllocator (boolean, int)». Может ли кто-нибудь сказать обходной путь для этой ошибки. Спасибо - person Arjun; 19.08.2019
comment
Какую версию ExoPlayer вы используете? DefaultAllocator доступен с версии 2.4.0. - person Massimo; 19.08.2019

Ответ @Massimo правильный, но этот способ устарел

использовать что-то вроде этого

DefaultLoadControl.Builder()
            .setBufferDurationsMs(
                DefaultLoadControl.DEFAULT_MIN_BUFFER_MS, 
                30_000, 
                DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
                DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS
            )
person Vlad    schedule 01.05.2019
comment
Для завершения шаблона построителя требуется .createDefaultLoadControl() в конце. - person Ali Nem; 12.11.2019