Получить все из ExoPlayer Cache

Используя https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/upstream/cache/CacheDataSourceFactory.html есть ли способ получить все кэшированные источники MediaSource?


person Nic Capdevila    schedule 04.01.2018    source источник


Ответы (1)


Кэш не предлагает удобного API для получения всех полностью кэшированных URI или подобных.

Если вы создаете свой собственный CacheEvictor (например, путем упаковки LeastRecentlyUsedCacheEvictor) вы можете вести собственный учет при добавлении или удалении диапазонов, а затем делегировать LRUCacheEvictor. Таким образом, вы можете вести список кэшированных URL-адресов.

Вы можете проверить, какие части для данного uri кэшируются:

// create the data spec of a given media file
Uri uri = Uri.parse("http://cool.stuff.com/song-123.mp3")
DataSpec dataSpec = new DataSpec(uri);
// get information about what is cached for the given data spec
CacheUtil.CachingCounters counters = new CacheUtil.CachingCounters();
CacheUtil.getCached(dataSpec, cache, counters);
if (counters.contentLength == counters.totalCachedBytes()) {
  // all bytes cached
} else if (counters.totalCachedBytes() == 0){
  // not cached at all
} else {
  // partially cached
}

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

NavigableSet<CacheSpan> cachedSpans =
   cache.getCachedSpans(CacheUtil.generateKey(uri));
person marcbaechinger    schedule 04.01.2018
comment
Это невероятно полезно, спасибо! Я определенно буду использовать это, но это не дает прямого ответа на вопрос, который я изначально пытался задать (вероятно, мне следовало уточнить его больше). Что касается каждого URI, который находится в кеше, нужно ли мне вести список URI в качестве входа и выхода из кеша самостоятельно, или есть способ просто захватить каждый доступный URI в кеше? Если мне нужно поддерживать его самостоятельно, как лучше всего это сделать. Еще раз спасибо за ваше понимание! - person Nic Capdevila; 04.01.2018
comment
Какой вариант использования вы пытаетесь реализовать? Собственно, зачем вам знать, что в кеше? Если вы пытаетесь добиться контролируемого поведения в автономном режиме, я рекомендую использовать загрузчик: github.com/google/ExoPlayer/blob/release-v2/library/core/src/ - person marcbaechinger; 04.01.2018
comment
Главной целью является то, что мой проигрыватель только для аудио будет извлекать новые дорожки и кэшировать их по мере их поступления, и если по какой-то причине ему не удается извлечь новую дорожку (плохое соединение или проблемы с сервером), он должен захватить дорожку из cache, чтобы продолжить непрерывное воспроизведение, продолжая этот процесс (если возможно, получить новую дорожку с сервера, если нет, перейти к следующей кэшированной дорожке). При захвате кеша он должен захватить самый старый трек (чтобы предотвратить повторение), а затем пометить его как недавно использованный (чтобы в следующий раз он не захватил тот же трек). Все это имеет смысл? - person Nic Capdevila; 04.01.2018
comment
Я понимаю. Да, я думаю, вам нужно самостоятельно вести карту uris/keys. Если вы используете SimpleCache, вы можете создать свой собственный CacheEvictor. Это может быть основано, например. LeastRecentlyCacheEvictor, который, кроме того, отслеживает, какие URL-адреса полностью кэшируются (в onSpanAdded), и добавляет их в список, если это так. Как только диапазон для этого uri/ключа будет удален, вам нужно снова удалить uri из этого списка. В случае потери сети вы просите у выселяющего список урисов. - person marcbaechinger; 05.01.2018
comment
Это имеет смысл для меня. Я также больше изучаю этот ProgressiveDownloader, так как он может быть полезен для моего варианта использования. Просматривая репозиторий ExoPlayer, кажется, что он используется только в тестах. Вы случайно не знаете, есть ли какие-либо ресурсы или реальное использование его или любого другого загрузчика, на который вы могли бы мне указать? Большое спасибо за вашу помощь. - person Nic Capdevila; 05.01.2018
comment
Я не могу дать вам ссылки, но будьте уверены, ExoPlayers Caches используется важными приложениями в производстве. - person marcbaechinger; 05.01.2018