Предотвратить повторную буферизацию при изменении максимальной скорости в ExoPlayer - PullRequest
7 голосов
/ 20 января 2020

Я использую setMaxBitrate, предоставленный DefaultTrackSelector, чтобы установить максимальную битовую скорость, когда пользователь меняет качество видео.

val parameters = defaultTrackSelector.buildUponParameters()
            .setMaxVideoBitrate(bitrate)
            .build()

defaultTrackSelector.parameters = parameters

Но как только эта функция вызывается, текущий буфер сбрасывается, и повторная буферизация отображается сразу. Есть ли способ продолжить воспроизведение, используя старый буфер, и просто загрузить новый буфер, используя новые настройки битрейта, как это делает YouTube?

Эта проблема обсуждалась здесь: https://github.com/google/ExoPlayer/issues/3522 https://github.com/google/ExoPlayer/issues/2250

Но, похоже, решения пока нет. Любая помощь по этому вопросу будет принята с благодарностью. Заранее спасибо.

1 Ответ

2 голосов
/ 23 января 2020

Вы можете легко это сделать. Вам уже нужно использовать ExoPlayer, а ExoPlayer - это метод seekTo().

В этом методе вы должны передавать только текущую позицию игрока, в которой вы остановлено раньше.

Шаг: -1 Вы должны изменить качество, например, 144p на 720p. В это изменяющееся время вы должны сохранить текущую ExoPlayer текущую позицию, используя этот метод: -

Private int currentPosition=player.getCurrentPosition();

Шаг -2 После того, как вам нужно создать источник медиа-информации exoplayer: -

// Measures bandwidth during playback. Can be null if not required.
        DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
        // Produces DataSource instances through which media data is loaded.
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, getString(R.string.app_name)), bandwidthMeter);
        // This is the MediaSource representing the media to be played.
        MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource("Pass Your Video Url");
        // Prepare the player with the source.
        player.prepare(videoSource);

Шаг 3: - проверьте это условие

if (this.currentPosition > 0) {
        player.seekTo(this.currentPosition);
        this.currentPosition = 0;
        player.setPlayWhenReady(true);
    } else {
        player.setPlayWhenReady(true);
    }

и это хорошо, что вы должны смотреть видео там, где вы остались.

Шаг 4: - Если ваше качество не очень хорошее, то используемое время является методом.

public int getWifiLevel()
{
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    int linkSpeed = wifiManager.getConnectionInfo().getRssi();
    int level = WifiManager.calculateSignalLevel(linkSpeed, 5);
    return level;
}

На основе уровня Wi-Fi или скорости соединения вы можете решить, имеет ли он низкое соединение или высокая связь inte rnet.

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