行业知识
Android Media3 ExoPlayer 开启缓存功能
2026-11-10 06:26:52
来源:互联网转载
ExoPlayer 开启播放缓存功能,在下次加载已经播放过的网络资源的时候,可以直接从本地缓存加载,实现为用户节省流量和提升加载效率的作用。
方法一:采用 ExoPlayer 缓存策略
第 1 步:实现 Exoplayer
参考 Exoplayer 官网 Release notes :
对应关系:
2.19.0 (2023-07-05) -- AndroidX Media3 1.1.0 release.
2.19.1 (2023-08-14) -- AndroidX Media3 1.1.1 release
Exoplayer 从 2.19.0 开始迁移至 AndroidX 的 Media3 框架内,2.19.1 是 Exoplayer 作为独立项目发布的最后一个版本,所以引入 Exoplayer 2.19.1 有以下两个方式,建议采用最新的方式 2。
# 方式1implementation 'com.google.android.exoplayer:exoplayer-core:2.19.1'implementation 'com.google.android.exoplayer:exoplayer-dash:2.19.1'implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.1'# 方式2implementation "androidx.media3:media3-exoplayer:1.1.1"implementation "androidx.media3:media3-exoplayer-dash:1.1.1"implementation "androidx.media3:media3-ui:1.1.1"
第 2 步:在应用的 Application 类中创建缓存策略
public class MyApplication extends Application { public SimpleCache simpleCache; public void onCreate() { super.onCreate(); //缓存最大值为100M LeastRecentlyUsedCacheEvictor leastRecentlyUsedCacheEvictor = new LeastRecentlyUsedCacheEvictor(100 * 1024 * 1024); if (simpleCache == null) { simpleCache = new SimpleCache(getCacheDir(), leastRecentlyUsedCacheEvictor, new ExoDatabaseProvider(this)); } } ...} 第 3 步:加载数据源,实现缓存
//本地资源(如:/sdcard/media/1.mp4)或 HTTP 资源Uri videoUri = Uri.parse("YOUR URL");MediaItem mediaItem = MediaItem.fromUri(videoUri);DefaultHttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true);// 这里的DefaultDataSource同时支持本地和HTTP请求的资源,自动实现检测 (The DefaultDataSource supports both local and Http sources. It automatically detects which one to use.)DefaultDataSource.Factory defaultDataSourceFactory = new DefaultDataSourceFactory(requireContext(), httpDataSourceFactory);//实现缓存CacheDataSource.Factory cacheDataSourceFactory = new CacheDataSource.Factory() .setCache(MyApplication.getAppInstance().simpleCache) .setUpstreamDataSourceFactory(defaultDataSourceFactory) .setFlags(CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR);MediaSource mediaSource = new ProgressiveMediaSource.Factory(cacheDataSourceFactory) .createMediaSource(mediaItem);player.setMediaSource(mediaSource, true); 方法二: 通过 Android Video Cache Library
开源库 AndroidVideoCache 的原理是通过代理的策略实现一个中间层,将网络视频请求转移到本地实现的代理服务器上,这样真正请求的数据就会被代理拿到,然后代理一边向本地写入数据,一边根据需要的数据看是读网络数据还是读本地缓存数据,从而实现数据的复用。
第 1 步:实现 VideoCache
implementation 'com.danikula:videocache:2.7.1'
第 2 步:在应用程序类中存储共享代理
public class MyApplication extends Application { private HttpProxyCacheServer proxy; public static HttpProxyCacheServer getProxy(Context context) { MyApplication app = (MyApplication) context.getApplicationContext(); return app.proxy == null ? (app.proxy = app.newProxy()) : app.proxy; } private HttpProxyCacheServer newProxy() { return new HttpProxyCacheServer.Builder(this) .maxCacheSize(1024 * 1024 * 1024) .build(); }} 第 3 步:Exoplayer 接入缓存
HttpProxyCacheServer proxy = getProxy(activity);//注意应采用来自代理的 url 而不是原始 url 来添加缓存String proxyUrl = proxy.getProxyUrl(VIDEO_URL);PlayerView playerView = findViewById(R.id.video_view);ExoPlayer player = ExoPlayerFactory.newSimpleInstance(VideoActivity.this, new DefaultRenderersFactory(this), new DefaultTrackSelector());MediaSource mediaSource = buildMediaSource(proxyUrl);player.prepare(mediaSource, true, false);playerView.setPlayer(player);
上一篇:游戏怎么利用服务器多开?
下一篇:gtaol怎么进服务器?