Предотвращение повторной буферизации Exoplayer для видео .mp4

В этом проекте есть «SimpleExoPlayer» и версия плеера «exoplayer: r2.5.3». После запуска приложения «SimpleExoPlayer» содержимое видео буферизуется и воспроизводится плавно. Но пользователь установил «SeekBar» в предыдущее положение, а «SimpleExoPlayer» повторно буферизуется для отображения видео. Это трудоемкий процесс для большого размера файла видео «.mp4». Помощь в решении этой проблемы приветствуется.

ниже мой код.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:padding="10dp">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="300dp"
                android:orientation="vertical">

                <com.google.android.exoplayer2.ui.SimpleExoPlayerView
                    android:id="@+id/simple_expo_player"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">


                </com.google.android.exoplayer2.ui.SimpleExoPlayerView>


            </LinearLayout>


        </LinearLayout>

    </ScrollView>


</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private SimpleExoPlayerView simpleExoPlayerView;

    SimpleExoPlayer player;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initUi();
    }

    public void initUi(){

// 1. Create a default TrackSelector
        BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
        TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
        TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

// 2. Create the player

        player = ExoPlayerFactory.newSimpleInstance(getApplicationContext(), trackSelector);


// 3. Produces DataSource instances through which media data is loaded.
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(getApplicationContext(), Util.getUserAgent(getApplicationContext(), "com.a3iteam.exoplayertest"));

// 4. Produces Extractor instances for parsing the media data.
        ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();

// 5. This is the MediaSource representing the media to be played.

        MediaSource videoSource = new ExtractorMediaSource(Uri.parse("https://www.w3schools.com/html/mov_bbb.mp4"),dataSourceFactory, extractorsFactory, null, null);


// 6. Prepare the player with the source.

        simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.simple_expo_player);

        simpleExoPlayerView.setPlayer(player);


    }


}

person Nuwan Withanage    schedule 23.10.2017    source источник
comment
Вы пытались открыть проблему в их репозитории github?   -  person Alberto M    schedule 23.10.2017


Ответы (1)


Мало что мешает проигрывателю буферизоваться, когда пользователь ищет назад. Прошлые данные удаляются после воспроизведения, и вы не можете легко изменить это поведение.

Существуют варианты минимизации задержки при поиске назад:

1. Убедитесь, что ваш сервер поддерживает запросы диапазона

Поддержка запросов диапазона является IMO обязательной при обслуживании видеофайлов и не только для поиска в обратном направлении, но и для поиска в целом.

Это трудоемкий процесс для большого размера файла видео «.mp4».

Размер файла mp4 не должен влиять на задержку при поиске назад. Ваше понятие «большой размер файла» заставляет меня думать, что ваш сервер может не поддерживать HTTP-запросы диапазона. Хотя я могу ошибаться. Просто чтобы убедиться. :)

Проверить можно так:

curl -I https://i.imgur.com/z4d4kWk.jpg

HTTP/1.1 200 OK ... Допустимые диапазоны: байты

Если вы видите заголовок «Accept-Ranges: bytes», запросы диапазона поддерживаются.

2. Использование кеша

Библиотека ExoPlayer поставляется с CacheDataSource и соответствующий CacheDataSourceFactory. Следовательно, вы можете легко кэшировать то, что загружено, обернув фабрику источников данных:

DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(
    getApplicationContext(), Util.getUserAgent(getApplicationContext(),
    "com.a3iteam.exoplayertest"));
Cache cache = new SimpleCache(cacheDir, 
    new LeastRecentlyUsedCacheEvictor(maxBytes));
dataSourceFactory = new CacheDataSourceFactory(cache,
    dataSourceFactory);

Когда пользователь выполняет поиск в обратном направлении, носитель загружается с локального диска вместо загрузки, что снижает задержку. Не уверен, хотите ли вы вообще кэшировать все только для варианта использования с обратным поиском. Может быть, ограничить его мобильными сетями. Буферизация Wi-Fi с запросом диапазона http должна быть достаточно хорошей.

В любом случае: удалите кэшированные данные как можно быстрее.

person marcbaechinger    schedule 29.10.2017
comment
Что, если текущая система использует Exoplayer 1 и DataSource, а не DataSourceFactory, и обновление до exoplayer 2 на данный момент невозможно? Есть ли способ интегрировать кэширование для exoplayer 1? - person Mohaimanul Chowdhury; 01.11.2018