Android Media3 ExoPlayer 开启缓存功能

这篇具有很好参考价值的文章主要介绍了Android Media3 ExoPlayer 开启缓存功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    ExoPlayer 开启播放缓存功能,在下次加载已经播放过的网络资源的时候,可以直接从本地缓存加载,实现为用户节省流量和提升加载效率的作用。

方法一:采用 ExoPlayer 缓存策略

第 1 步:实现 Exoplayer

参考 Exoplayer 官网 Release notes :

androidx media3,Android,android,缓存,exoplayer,media3

对应关系:

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。

# 方式1
implementation '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'

# 方式2
implementation "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 接入缓存文章来源地址https://www.toymoban.com/news/detail-766597.html

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

到了这里,关于Android Media3 ExoPlayer 开启缓存功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 13.0 开启禁用系统接收短信功能

     在13.0的系统rom定制化中,在一些wifi产品的机器中,对于系统4g部分的功能需要裁剪 比如拨打电话 接听电话 短信功能等这部分 需要禁用系统对应的功能,接下来就来初步分析下系统中接收短信部分功能,然后实现禁用接收短信功能 对于Mms应用程序来讲主要就是在信息数据

    2024年02月22日
    浏览(62)
  • Android 播放视频之ExoPlayer

    在上一篇中,我们了解了系统自带的 VideoView 来播放视频,但其支持的视频格式偏少,我们需要其他的视频播放器。 ExoPlayer 是Google的开源的应用级媒体播放器项目,支持多种视频格式和流媒体播放,GitHub地址。 导入 ExoPlayer 在布局文件里添加 StyledPlayerView 在 Activity 里面播放

    2024年02月15日
    浏览(49)
  • 【干货】Android系统定制基础篇:第六部分-Android扩展服务-AndroidX

    AndroidX 做为一个后台 Service 应用,开机自动运行,配合系统做一些定制化功能,并且对外提供 API。 主要功能: ● 硬件看门狗代理 ● USB Host/Device 切换 ● 4G 网络保活 ● 系统日志写入文件 ● 键值拦截 ● 启用应用 项目地址:https://github.com/aystshen/AndroidX 硬件看门狗代理主要

    2024年02月09日
    浏览(57)
  • Android 应用自动开启辅助(无障碍)功能并使用辅助(无障碍)功能

    目录 一.背景 二.前提条件 三.将普通应用转换成系统应用 1.在AndroidManifest文件中添加

    2024年02月09日
    浏览(46)
  • Android Studio导入项目时导入包标红的问题androidx.core:core:1.6.0,例如:import androidx.core.app.ActivityCompat;

    其中 import androidx.core.app.ActivityCompat;import androidx.core.content.ContextCompat; import androidx.appcompat.app.AppCompatActivity;这些出现了红标, 这段代码中的红色波浪线通常表示代码中存在错误或警告。在这种情况下,可能是由于缺少必要的导入或库而导致的。 在这段代码中,缺少所需的依赖

    2024年02月14日
    浏览(38)
  • Android 10.0 系统开启禁用adb push和adb pull传输文件功能

      在进行10.0的系统开发中,在一些产品中由于一些开发的功能比较重要,防止技术点外泄在出货产品中,禁用 adb pull 和adb push等命令 来获取系统system下的jar 和apk 等文件,所以需要禁用这些命令 看了下系统源码中的adb的代码,adb的源码在system/core/adb下面, (1)adb的本质,就

    2024年02月10日
    浏览(87)
  • Android 9.0 系统开启禁用adb push和adb pull传输文件功能

      在进行9.0的系统rom定制化开发中,在一些产品中由于一些开发的功能比较重要,防止技术点外泄在出货产品中,禁用 adb pull 和adb push等命令 来获取系统system下的jar 和apk 等文件,所以需要禁用这些命令 看了下系统源码中的adb的代码,adb的源码在system/core/adb下面, (1)adb的本

    2024年01月21日
    浏览(51)
  • Android报错:Dependency‘androidx.annotation:xx requires libraries and applications ...

    Android导入文件包编译报错 翻译了一下 是需要 修改CompileSDKVersion更改为报错中提示的版本 打开项目 build. gradle 文件,将compileSdk和targetSdk修改为报错中提示的版本即可 报错解决啦

    2024年02月08日
    浏览(37)
  • 深入理解Android音视频同步机制(一)ExoPlayer的avsync逻辑

    对于此前没有了解过ExoPlayer的朋友,我们在这里先用下面的时序图简单介绍一下ExoPlayer在音视频同步这块的基本流程: 图中 ExoPlayerImplInternal是Exoplayer的主loop所在处,这个大loop不停的循环运转,将下载、解封装的数据送给AudioTrack和MediaCodec去播放。 MediaCodecAudioRenderer和MediaC

    2023年04月12日
    浏览(56)
  • Android ExoPlayer2播放m3u8视频设置Cookie

    支持m3u8格式视频,同时服务端做了加密防止视频被盗。 服务端需要客户端这边再请求.m3u8地址时带上3个Cookie参数,分别是CloudFront-Policy,CloudFront-Signature,CloudFront-Key-Pair-Id。 本地使用了GSYVideoPlayer作为视频播放器,如何设置Cookie是个问题,原本以为直接将待传入的三个Cookie直接

    2024年01月16日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包