Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using cache in ExoPlayer

I'm looking for any example of implementing cache in ExoPlayer.

ExoPlayer has in its library different classes concerning cache and Google explain in this video that we can implement it with the CacheDataSource class, but Google doesn't provide any demo on it. Unfortunately this seems pretty complicated to use, so I'm currently looking for examples (no success on Google).

Does anyone succeed or has any info that would help ? Thanks.

like image 305
ilansas Avatar asked Feb 24 '15 15:02

ilansas


People also ask

How do you cache videos on ExoPlayer?

By default ExoPlayer do not cache media (video, audio, etc...). For example if you want to play an online video file, each time ExoPlayer will open a connection, read data then play it. Fortunately, it provides us some interfaces and implementation classes to support caching media in our app.

Does YouTube use ExoPlayer?

ExoPlayer is an app-level media player built on top of low-level media APIs in Android. It is an open source project used by Google apps, including YouTube and Google TV.


1 Answers

Here is the solution for ExoPlayer 2.+

Create a custom cache data source factory

public class CacheDataSourceFactory implements DataSource.Factory {     private final Context context;     private final DefaultDataSourceFactory defaultDatasourceFactory;     private final long maxFileSize, maxCacheSize;      public CacheDataSourceFactory(Context context, long maxCacheSize, long maxFileSize) {         super();         this.context = context;         this.maxCacheSize = maxCacheSize;         this.maxFileSize = maxFileSize;         String userAgent = Util.getUserAgent(context, context.getString(R.string.app_name));         DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();         defaultDatasourceFactory = new DefaultDataSourceFactory(this.context,                 bandwidthMeter,                 new DefaultHttpDataSourceFactory(userAgent, bandwidthMeter));     }      @Override     public DataSource createDataSource() {         LeastRecentlyUsedCacheEvictor evictor = new LeastRecentlyUsedCacheEvictor(maxCacheSize);         SimpleCache simpleCache = new SimpleCache(new File(context.getCacheDir(), "media"), evictor);         return new CacheDataSource(simpleCache, defaultDatasourceFactory.createDataSource(),                 new FileDataSource(), new CacheDataSink(simpleCache, maxFileSize),                 CacheDataSource.FLAG_BLOCK_ON_CACHE | CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR, null);     } } 

And the player

BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(); TrackSelection.Factory videoTrackSelectionFactory =         new AdaptiveTrackSelection.Factory(bandwidthMeter); TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);  SimpleExoPlayer exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector); MediaSource audioSource = new ExtractorMediaSource(Uri.parse(url),             new CacheDataSourceFactory(context, 100 * 1024 * 1024, 5 * 1024 * 1024), new DefaultExtractorsFactory(), null, null); exoPlayer.setPlayWhenReady(true);  exoPlayer.prepare(audioSource); 

It works pretty well.

like image 167
Bao Le Avatar answered Sep 23 '22 07:09

Bao Le