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

21

Я ищу любой пример реализации кеша в ExoPlayer.

ExoPlayer имеет в своей библиотеке различные классы, относящиеся к кешу, и Google объясняет в этом видео , что мы можем реализовать его с помощью класс CacheDataSource, но Google не предоставляет никаких демо-версий. К сожалению, это довольно сложно использовать, поэтому в настоящее время я ищу примеры (без успеха в Google).

Кто-нибудь преуспеет или имеет какую-либо информацию, которая поможет? Спасибо.

    
задан ilansas 24.02.2015 в 16:56
источник
  • прочитайте этот doc developer.android.com/guide/topics/media/exoplayer.html –  rogerwar 25.02.2015 в 16:32
  • Очевидно, я прочитал его ... Нет, похоже, пока это невозможно реализовать. Это слишком плохо ... github.com/google/ExoPlayer/issues/57 –  ilansas 26.02.2015 в 09:43
  • Поделитесь своим кодом, что вы сделали до сих пор –  rogerwar 26.02.2015 в 11:30
  • К сожалению, но в настоящее время этот кеш работает только с DASH. github.com/google/ExoPlayer/issues/420 –  aeracode 11.03.2016 в 11:32

3 ответа

14

Вот решение для ExoPlayer 2. +

Создайте фабрику источников данных пользовательского кэша

class CacheDataSourceFactory implements DataSource.Factory {
    private final Context context;
    private final DefaultDataSourceFactory defaultDatasourceFactory;
    private final long maxFileSize, maxCacheSize;

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

И игрок

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

Это работает очень хорошо.

    
ответ дан Bao Le 03.08.2017 в 17:24
  • Моя проблема с этим решением заключается в том, что если я использую это для кэширования и обработки нескольких видеороликов, несколько игроков могут воспроизводить одни и те же данные (т. е. кажется, что для разных uri один и тот же поток данных возвращается из кеша). Эта проблема не возникает при использовании стандартного ExtractorMediaSource. Ури для видеороликов уникальны –  Nino van Hooff 20.09.2017 в 14:09
  • Решение проблемы: сохранить общий экземпляр SimpleCache вместо его создания в createDataSource. в противном случае несколько объектов кэша будут записываться в те же файлы, что создает проблемы –  Nino van Hooff 20.09.2017 в 17:14
  • его работы спасибо –  Sohail Zahid 26.09.2017 в 10:15
  • thnx.its работает, но есть ли какое-нибудь решение для кеша шифрования? –  vishal patel 29.09.2017 в 10:17
  • Поддерживает ли он кеш диска? или только в кеше памяти? –  IshRoid 24.11.2017 в 08:46
Показать остальные комментарии
5

Вот пример, который заменяет источник демо-данных на OkHttp, по умолчанию нет кеша Ссылка Ссылка Таким образом, вам просто нужно правильно настроить OkHttp-кеш, и запросы должны быть кэшированы.

    
ответ дан Jacek Tymicki 11.12.2015 в 15:51
  • Я получил OkHttpDataSource из демонстрационного приложения exoplayer 2.2.0. Можете ли вы поделиться некоторыми ссылками для настройки кэша OkHttp. –  Pranesh Sahu 16.03.2017 в 07:17
2

Я реализовал его так, как в построителе рендеринга

private static final int BUFFER_SEGMENT_SIZE = 64 * 1024;
private static final int BUFFER_SEGMENT_COUNT = 160;

final String userAgent = Util.getUserAgent(mContext, appName);
final DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
final Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE);*

Cache cache = new SimpleCache(context.getCacheDir(), new LeastRecentlyUsedCacheEvictor(1024 * 1024 * 10));
DataSource dataSource = new DefaultUriDataSource(context, bandwidthMeter, userAgent);
CacheDataSource cacheDataSource = new CacheDataSource(cache, dataSource, false, false);
ExtractorSampleSource sampleSource = new ExtractorSampleSource(uri
                , cacheDataSource
                , allocator
                , BUFFER_SEGMENT_COUNT * BUFFER_SEGMENT_SIZE
                , new Mp4Extractor());
    
ответ дан S.Prapagorn 10.08.2015 в 09:09
  • Этот код компилируется и запускается, но, похоже, не записывает видео в указанной папке кеша. Он работает на вас? Играет ли он из кеша без подключения к Интернету? Более глубокая информация была бы оценена. благодаря –  voghDev 05.10.2015 в 13:15
  • Также добавлен этот код, но, как указано выше, он не похож, что он кэширует что-либо. Здесь что-то нам не хватает? –  Gil 26.10.2015 в 08:49
  • Согласно github.com/google/ExoPlayer/issues/420, этот ответ действителен только для потоков DASH. Для файлов MP4, OkHttpDataSource, кажется, дает хорошие результаты (по словам людей в этом потоке). –  David Ferrand 22.04.2016 в 12:15