CacheDataSource против SimpleCache в exoplayer?

Sep 14 2020

Меня очень смущает ExoPlayer и его документация. Объясните, пожалуйста, для какой цели и когда мы должны использовать CacheDataSource, а когда SimpleCache?

Ответы

Sdghasemi Sep 15 2020 at 04:33

CacheDataSourceи SimpleCacheвыполнять две разные цели. Если вы посмотрите на прототип их класса, вы увидите, что CacheDataSource implements DataSourceи SimpleCache implements Cache. Если вам нужно кэшировать загруженные видео , которые вы должны использовать CacheDataSourceкак ваши , DataSource.Factoryчтобы подготовить воспроизведение ваших средств массовой информации:

// Produces DataSource instances through which media data is loaded.
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "AppName"));
dataSourceFactory = new CacheDataSourceFactory(VideoCacheSingleton.getInstance(), dataSourceFactory);

А затем используйте dataSourceFactoryдля создания MediaSource:

// This is the MediaSource representing the media to be played.
MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
        .createMediaSource(mediaUri);
SimpleExoPlayer exoPlayerInstance = new SimpleExoPlayer.Builder(context).build();
exoPlayerInstance.prepare(mediaSource);

Хотя SimpleCacheпредлагает вам реализацию кеша, которая поддерживает представление в памяти. Как вы можете видеть в первом блоке кода, конструктору CacheDataSourceFactory нужен Cacheэкземпляр для работы. Вы можете объявить свой собственный механизм кеширования или использовать SimpleCacheкласс по умолчанию, который вам предоставляет ExoPlayer. Если вам нужно использовать реализацию по умолчанию, вы должны помнить об этом:

Только один экземпляр SimpleCache разрешен для данного каталога в данный момент времени.

Согласно документации . Итак, чтобы использовать один экземпляр SimpleCacheдля папки, мы используем шаблон объявления singleton:

public class VideoCacheSingleton {
    private static final int MAX_VIDEO_CACHE_SIZE_IN_BYTES = 200 * 1024 * 1024;  // 200MB

    private static Cache sInstance;

    public static Cache getInstance(Context context) {
        if (sInstance != null) return sInstance;
        else return sInstance = new SimpleCache(new File(context.getCacheDir(), "video"), new LeastRecentlyUsedCacheEvictor(MAX_VIDEO_CACHE_SIZE_IN_BYTES), new ExoDatabaseProvider(context)));
    }
}

TL; DR

Мы используем CacheDataSourceдля подготовки кэширующего воспроизведения мультимедиа и SimpleCacheдля создания его DataSource.Factoryэкземпляра.