CacheDataSource vs SimpleCache w exoplayer?

Sep 14 2020

Jestem bardzo zdezorientowany z ExoPlayerem i ich dokumentacją. Czy proszę o wyjaśnienie, w jakim celu i kiedy powinniśmy używać CacheDataSource, a kiedy SimpleCache?

Odpowiedzi

Sdghasemi Sep 15 2020 at 04:33

CacheDataSourcei SimpleCachespełniają dwa różne cele. Jeśli spojrzysz na prototyp ich klasy, zobaczysz to CacheDataSource implements DataSourcei SimpleCache implements Cache. Kiedy musisz buforować pobrane filmy, których musisz użyć CacheDataSourcejako swojego, DataSource.Factoryaby przygotować odtwarzanie multimediów:

// 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);

A następnie użyj, dataSourceFactoryaby utworzyć 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);

Chociaż SimpleCacheoferuje implementację pamięci podręcznej, która utrzymuje reprezentację w pamięci. Jak widać w pierwszym bloku kodu, konstruktor CacheDataSourceFactory potrzebuje Cacheinstancji do pracy. Możesz zadeklarować własny mechanizm buforowania lub użyć domyślnej SimpleCacheklasy, którą zapewnia Ci ExoPlayer. Jeśli chcesz użyć domyślnej implementacji, pamiętaj o tym:

W danym katalogu dozwolona jest tylko jedna instancja SimpleCache

Zgodnie z dokumentacją . Aby więc użyć pojedynczego wystąpienia SimpleCachefolderu dla folderu, używamy wzorca deklaracji 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

Używamy CacheDataSourcedo przygotowania odtwarzania multimediów z pamięci podręcznej i SimpleCachedo zbudowania jego DataSource.Factoryinstancji.