【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存 原创 精华

软通田可辉
发布于 2021-4-6 10:33
浏览
20收藏

引言

对于视频播放器这个app大家都不陌生,在我们日常生活中随处可见,但对于用户而言,最重要的就是如何能节约流量,使用简单,观看视频流畅等体验。对于Android VideoCache 在各大网站的学习文档、教程已经很多,而且层出不穷,但是对于鸿蒙来讲,还是一个新的领域,因此,鸿蒙版的VideoCache 顺势而为,华丽的诞生了。

功能介绍

鸿蒙VideoCache视频缓存组件,主要功能包括:视频缓冲,在线播放视频,边下载边缓存,缓冲进度和播放进度同时进行,拖动播放,横竖屏切换,音量调节等主要功能。模拟机效果图如下:

1.竖屏状态:【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

2.横屏状态

【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

接下来得内容就是重中之重,对于开发者来讲,如何简单并且快速的使用该VideoCache视频缓存组件,这才是开发者最关注的问题。下面则详细介绍VideoCache的使用以及开发指南。

VideoCache使用指南

Ø 新建工程, 添加组件Har包依赖

在应用模块中添加HAR,只需要将videocachelibrary-debug.har复制到entry\libs目录下即可

Ø 修改配置文件

1. 在entry下面的build.gradle添加library 的依赖,如图所示:

【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

1. 修改代码中的配置:

a. 在基类中实例化代理服务,核心代码如下:

httpProxyCacheServer =
                new HttpProxyCacheServer.Builder(theApplication).headerInjector(new UserAgentHeadersInjector())
                .maxCacheSize(1024 * 1024 * 1024)// 1 Gb for cache
                .singleFileBandwidth(600)//单位KB,https需要1.5倍左右
                .build();

b.在使用的地方初始化播放器,并调用代理服务将新生成的路径传入播放器,代码如下:

proxyUrl = BaseSlice.getProxy().getProxyUrl("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
    BaseSlice.getProxy().registerCacheListener(mCacheListener, proxyUrl);//缓存监听
    playerVideo = new PlayerVideo(this, proxyUrl, this, layout);
    playerVideo.setDisplayMath(0, 1000);

c.其他相关设置方法,代码如下:

* 设置播放器的宽高
 dependentLayout.setWidth(width);
     dependentLayout.setHeight(height);
或者:
dependentLayout.setWidth(ComponentContainer.LayoutConfig.MATCH_PARENT);
        dependentLayout.setHeight(ComponentContainer.LayoutConfig.MATCH_PARENT);
    
 * 设置播放器的横竖屏
//横屏
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.LANDSCAPE);
//竖屏
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.PORTRAIT);
//系统判断
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.UNSPECIFIED);
//跟随栈中应用
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.FOLLOWRECENT);


 * 初始化播放器
player = new Player(context);
    surfaceProvider.pinToZTop(false);
    java.util.Optional<ohos.agp.graphics.SurfaceOps> optional = surfaceProvider.getSurfaceOps();
    SurfaceOps surfaceOps = optional.get();
    surfaceOps.addCallback(new VideoSurfaceCallback(surfaceOps, loadUrl,
            player, this
    ));

 * 播放方法
 player.play();

 * 暂停播放方法
 player.pause();

VideoCache开发指南

      在上述中,已经大概说了VideoCache 的功能点,视频缓冲,在线播放视频,边下载边缓存,缓冲进度和播放进度同时进行,拖动播放,横竖屏切换,音量调节等主要功能,接下来一 一说明主要实现方法。

在视频播放器中,最常见的就是缓冲进度条,进度条用户可以很直观的看到目前已经缓冲的视频有多少,缓冲了多长时间,进度条设置代码如下:

     progressBar.setMaxValue(100);
     progressBar.setMinValue(0);
     progressBar.setProgressValue(cacheProgress);

      通过根据已经缓冲的字节,即可计算出cacheProgress

MaxValue 值不是固定的100,也可以按照视频的时长、字节等设置,然后计算百分比即可,根据具体需求设计。

MinValue设置progress 的起始点,最初的起始点肯定是0,但是当视频在播放中途,暂停,在开始的时候,则需要设置为暂停时的值,这样不至于又回到0来观看视频。

        最后,既然是视频缓存组件,那么重中之重就是如何缓存,接下来重点介绍

        VideoCache主要通过代理策略将网络请求代理到本地服务,本地在决定是从本地缓存拿数据还是发起网络请求,如果发起网络请求就先将数据写入缓存,再从本地提供视频数据给视频播放器,参考下图【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

这样就达到了边播放边缓存的策略。

具体步骤如下:

1.在项目的基类初始化一个全局的代理服务HttpProxyCacheServer,【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

2.生成缓存文件名,默认是使用的 MD5 方式生成 key,考虑到一些业务逻辑,我们也可以继承一个 FileNameGenerator 来实现自己的策略,具体代码如下:【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

3.本地代理实现策略,首先是构造一个本地127.0.0.1的ServerSocker,随机分配了一个端口,然后启动一个线程去执行WaitRequestsRunnable,在这里面执行 waitForRequest,通过 accept() 方法监听这个服务器 socket 的入站连接,accept() 方法会一直阻塞,直到有一个客户端尝试建立连接。【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

1. FileCache类

      类中规定了缓存文件的命名格式(后加.download)和存储的路径,完成了缓存文件的创建。

【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

2. Files类

      此类是对JAVA中原有的File类的封装,原File类仅可处理一个文件,Files类可同时对多个文件进行处理。

      如下代码中,getLruListFiles()方法的参数是一个directory,在方法中对directory(文件夹路径)下的所有文件进行拆分,返回了一个File参数类型的List列表,后续可对列表中的各个File文件进行处理。【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

3. LruDiskUsage类

此类主要用于控制缓存文件的大小,它与Videocache平行开了一个线程,实时记录缓存文件的数量、大小、存储空间等,超过预设的阈值时,执行特定的优化操作。【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

4. Md5FileNameGenerator类

此类实现了为输入文件路径,生成对应的MD5值的功能。MD5值是一种被"压缩"的保密格式,可以确保信息完整传输。

【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

5. TotalCountLruDiskUsage类、TotalSizeLruDiskUsage类和UnlimitedDiskUsage类

          LruDiskUsage类是标题中前两个类的父类,同时控制缓存文件的大小和数量,需要判断当前缓存文件的(总大小 & 总数量)未超过阈值时,才会缓存新的文件。   TotalCountLruDiskUsage类和TotalSizeLruDiskUsage类分别只对缓存文件总数量或者缓存文件总大小进行限制,满足一个条件便可以缓存新的文件。

         TotalCountLruDiskUsage类和TotalSizeLruDiskUsage类各有两个方法:一个方法用于设定缓存文件的阈值;一个方法用于判断当前缓存数据是否超过了设定的阈值。

       当不需要进行磁盘的缓存限制时使用UnlimitedDiskUsage类,其本身是一个空的类,不对缓存文件的数量和大小做任何限制。【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区

【软通动力】HarmonyOS三方件开发指南(16)-VideoCache 视频缓存-鸿蒙开发者社区更多原创,请关注"软通动力HarmonyOS学院https://harmonyos.51cto.com/column/30

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
23
收藏 20
回复
举报
20条回复
按时间正序
/
按时间倒序
软通小精灵
软通小精灵

辉哥得加快节奏了

回复
2021-4-6 10:57:42
芒果爱学习
芒果爱学习

感谢分享

回复
2021-4-6 10:58:25
红叶亦知秋
红叶亦知秋

讲的很详细,学习了。

回复
2021-4-6 11:26:58
软通田可辉
软通田可辉 回复了 红叶亦知秋
讲的很详细,学习了。

感谢支持

回复
2021-4-6 11:32:11
软通田可辉
软通田可辉 回复了 芒果爱学习
感谢分享

感谢支持

回复
2021-4-6 11:32:21
软通田可辉
软通田可辉 回复了 软通小精灵
辉哥得加快节奏了

是呀是呀

回复
2021-4-6 11:57:30
鸿蒙张荣超
鸿蒙张荣超

赞赞赞!

回复
2021-4-6 12:31:21
软通田可辉
软通田可辉 回复了 鸿蒙张荣超
赞赞赞!

感谢张老师长期以往的支持

回复
2021-4-6 14:07:20
longlong899
longlong899

读老师的每篇文章都有收获,感谢分享!

回复
2021-4-6 17:19:31
温柔一刀
温柔一刀

不错哦。。。。。

回复
2021-4-6 17:33:56
软通田可辉
软通田可辉 回复了 longlong899
读老师的每篇文章都有收获,感谢分享!

感谢支持

回复
2021-4-7 09:23:15
软通田可辉
软通田可辉 回复了 温柔一刀
不错哦。。。。。

感谢支持

回复
2021-4-7 09:23:27
mb600fb310dea6c
mb600fb310dea6c

大佬 你这边有  通讯录获取和调用系统相机的资料吗 

已于2021-4-9 10:19:21修改
回复
2021-4-9 10:19:10
软通田可辉
软通田可辉 回复了 mb600fb310dea6c
大佬 你这边有 通讯录获取和调用系统相机的资料吗

这个后期会更新的。

回复
2021-4-12 15:45:51
朱伟ISRC
朱伟ISRC

请问老师,有源代码吗~

1
回复
2021-4-13 11:39:11
软通田可辉
软通田可辉 回复了 朱伟ISRC
请问老师,有源代码吗~

你好,有的

回复
2021-4-13 14:07:07
朱伟ISRC
朱伟ISRC 回复了 软通田可辉
你好,有的

老师 可以提供下源代码的地址吗  我去gitee的仓库没找到呢~

回复
2021-4-14 18:22:28
软通田可辉
软通田可辉 回复了 朱伟ISRC
请问老师,有源代码吗~

还没开放,开放后回你

回复
2021-4-16 16:42:57
wx60a368ad83d76
wx60a368ad83d76

有个问题,我播放器我切换地址再次点击播放为什么界面停止不动了?画面一直是死的什么情况?

回复
2021-5-18 15:14:39
wx5ee353c816339
wx5ee353c816339

是否能共享源码,很多配置初学者搞不定啊。

回复
2021-5-28 17:30:34
回复
    相关推荐